TCP(Transmission Control Protocol)란
- TCP는 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟을 안정적으로, 순서대로, 에러없이 교환할 수 있게 한다.
- TCP는 전송 계층에 위치한다.
- TCP는 웹 브라우저들이 월드 와이드 웹에서 서버에 연결할 때 사용되며, 이메일 전송이나 파일 전송에도 사용된다.
- TCP의 안정성을 필요로 하지 않는 애플리케이션의 경우 일반적으로 TCP 대신 UDP(User Datagram Protocol)을 사용한다. 이것은 전달 확인 및 순차 보장 기능이 없는 대신 오버헤드가 작고 지연시간이 짧다는 장점이 있다.
- 특징
- 연결지향적
- 3 way handshaking 과 4 way handshaking 작업으로 인한 신뢰성 보장
- 순서 보장
- QUIC
Handshake
- TCP는 3 way handshaking 과 4 way handshaking 작업으로 신뢰성을 보장한다.
- 정확한 데이터 전송을 위해 서버-클라이언트 간의 세션을 먼저 수립하는 과정이다
- 3-Way handshake는 TCP의 연결을 초기화하는 과정이다.
- 4-Way handshake는 세션을 종료할 때 발생한다.
- handshake 하는 동안 특정 비트를 활성화한 패킷을 주고 받는다.
패킷
- Urg (Urgent) : 긴급 비트로 순서에 상관없이 먼저 송신됨
- Ack (Acknowledgement) : 확인응답 비트
- Psh (Push) : 버퍼가 차기를 기다리지 않고 바로 응용계층으로 전달, 대화형 트래픽에 사용 - Rst (Reset) : Establised된 회선에 강제 리셋 요청. 연결상의 문제가 있을 때 사용
- Syn (Synchronize) : 송수신 간에 순서 번호의 동기화
- Fin (Finish) : 연결 해제
- TCP 헤더에는 Urg-Ack-Psh-Rst-Syn-Fin 6개의 flag bit 가 존재한다.
- 보내고자하는 상태 플래그에 따라 1로 활성화 해서 보낸다.
3 way handshake
- 클라이언트가 서버에게 접속을 요청하는 SYN 패킷을 보낸다. 이때 클라이언트는 서버로부터 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다. 이때 seq number에 의미없는 난수를 보낸다.
- 서버는 SYN요청을 받고 클라이언트에게 요청을 수락한다는 ACK 와 SYN가 설정된 패킷을 보낸다. 이때 B서버는 SYN_RECEIVED 상태가 된다. 이때 서버는 ack number에 클라이언트의 seq number에 +1을 한 값을 보낸다.
- 클라이언트가 서버에게 ACK를 보내면 연결이 이루어지고 데이터를 전송한다. 이때 서버 상태는 ESTABLISHED 이다. 이 때 클라이언트는 ack number에 서버의 seq number에 +1을 한 값을 보낸다.
4 way handshake
- 클라이언트가 서버에게 연결을 종료하겠다는 FIN 패킷을 전송한다.
- 서버는 클라이언트에게 ACK 메시지를 보내고 자신의 통신이 끝날때까지 기다린다. 이때 서버는 TIME_WAIT 상태이다.
- 서버는 통신이 끝나면 클라이언트에게 FIN 패킷을 전송한다.
- 클라이언트가 서버에게 ACK 메시지를 보내고 통신이 종료된다.
패킷 교환 (payload) 절차
참고 :
https://www.thegeekstuff.com/2011/11/tcp-ip-fundamentals/
https://hwan-shell.tistory.com/271
https://ko.wikipedia.org/wiki/전송_제어_프로토콜
https://mindnet.tistory.com/entry/네트워크-쉽게-이해하기-22편-TCP-3-WayHandshake-4-WayHandshake
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=bloodsoda&logNo=220986271516
https://asfirstalways.tistory.com/356
http://www.ktword.co.kr/abbr_view.php?m_temp1=2437
https://www.cs.miami.edu/home/burt/learning/Csc524.032/notes/tcp_nutshell.html
https://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/