TCP
전송 제어 프로토콜(Transmission Control Protocol)
- Transport Layer(4L)의 연결 지향 프로토콜
특징
- 연결지향 - TCP 3 way handshake (가상 연결)
- 데이터 전달 보증
- 순서 보장
- 신뢰 가능한 프로토콜
- 현재는 대부분 TCP 사용
TCP 3 way handshake
- TCP/IP 프로토콜을 이용해서 통신하는 응용프로그램이 데이터를 전송하기 전에 먼저 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미 (정확한 전송을 보장하기 위해)
Client → Server: TCP SYN
Server → Client: TCP SYN ACK
Client → Server: TCP ACK
용어
SYN: Synchronize Sequence Numbers
ACK: Acknowledgement
과정
- Client가 Server에 접속 요청 SYN 패킷을 보낸다. 이때 Client는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 되는 것이다.
- Server는 SYN 요청을 받고 Client에게 요청을 수락한다는 ACK와 SYN 플래그가 설정된 패킷을 발송하고 다시 Client가 ACK 응답하기를 기다린다. 이때 Server는 SYN_RECEIVED 상태가 된다.
- Client는 Server에게 ACK을 보내고 이후부터는 연결이 이루어지고 데이터가 오가게 된다. 이때 Server의 상태가 ESTABLISHED이다.
TCP 4 way handshake
과정
- Client가 Server에게 연결을 종료하겠다는 FIN 플래그를 전송한다.
- Server는 일단 확인했다는 ACK 메시지를 보내고 자신의 통신이 끝날 때까지 기다리는데, 이 상태가 TIME_WAIT 상태이다.
- Server가 통신이 끝났으면 연결이 종료되었다는 FIN 플래그를 전송한다.
- Client는 확인했다는 ACK 메시지를 보낸다.
TCP 빠른 재전송
- 패킷을 받는 수신자 입장에서는 세그먼트로 분할된 내용들이 순서대로 도착하지 않는 경우가 생길 수 있다.
- 이런 상황이 발생했을 때 수신 측에서는 순서대로 잘 도착한 마지막 패킷의 다음 순번을 ACK 패킷에 실어서 보낸다.
- 그리고 이런 중복 ACK를 3개 받으면 재전송이 이루어진다. 송신 측은 자신이 설정한 타임 아웃 시간이 지나지 않았어도 바로 해당 패킷을 재전송할 수 있기 때문에 보다 빠른 재전송률을 유지할 수 있다.
파이프라이닝 프로토콜 과정(중복 ACK, 타임 아웃)을 참고해서 본다면 좋을 듯 하다.
혼잡 제어(Congestion control)
- 데이터의 양이 라우터가 처리할 수 있는 양을 초과하면 초과된 데이터는 라우터가 처리하지 못한다.
- 이때, 송신 측에서는 라우터가 처리하지 못한 데이터를 손실 데이터로 간주하고 계속 재전송하여 네트워크를 혼잡하게 한다.
- 이런 상황은 송신 측의 전송 속도를 적절히 조절하여 예방할 수 있는데, 이것을 혼잡 제어라고 한다.
정리하자면, 혼잡 제어는 전송 속도 조절을 통해 네트워크 내의 패킷 수를 제어하여 네트워크의 오버플로우를 방지하는 기능이다.
흐름 제어(Flow control)
- 수신 측이 송신 측보다 데이터 처리 속도가 빠르면 문제가 없지만, 송신 측의 속도가 빠를 경우 문제가 생긴다.
- 수신 측에서 제한된 저장 용량을 초과한 이후에 도착하는 패킷은 손실될 수 있으며, 만약 손실된다면 불필요한 추가 패킷 전송이 발생하게 된다.
- 흐름 제어는 위와 같이 송신 측과 수신 측의 TCP 버퍼 크기 차이로 인해 생기는 데이터 처리 속도 차이를 해결하기 위한 기법이다.
정리하자면, 흐름 제어는 데이터 처리 속도를 조절하여 송/수신 사이의 패킷 수를 제어하는 기능이다.
reference
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
https://mindnet.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-22%ED%8E%B8-TCP-3-WayHandshake-4-WayHandshake
https://steady-coding.tistory.com/507