[network] TCP
Updated:
개요
- 전송 제어 프로토콜(TCP, Transmission Control Protocol)
- RFC793
- 신뢰성(유실 없이, 순서대로 송수신)을 보장하는 프로토콜
TCP 세그먼트(segment)
- 프로토콜 데이터 단위
- PDU(Protocol Data Unit)
- 패킷이라는 용어가 종종 사용되지만 정확한 표현이 아님
- 헤더와 데이터 섹션으로 구성
- 데이터 스트림으로부터 데이터를 받아 들여 이것을 청크 단위로 분할한 뒤 TCP 헤더를 덧붙여 TCP 세그먼트를 생성
- TCP 세그먼트는 IP 데이터그램에 패킷화되어 송수신
- 프로세스는 TCP를 통해 데이터 버퍼를 인수로 전달함으로써 데이터 전송
- TCP는 버퍼들을 묶어 세그먼트를 생성하여 IP를 통해 목적지의 TCP로 세그먼트를 전송
동작
- 연결 생성 -> 데이터 전송 -> 연결 종료
- 연결 생성
- 3 way handshake
- 송수신을 보장하기 위해 사전에 세션을 수립하는 과정
- 클라이언트가 서버에게 SYN(SYnchronize sequence Numbers)(연결 요청) 플래그 전송
- 클라이언트는 SYN/ACK 응답을 기다리는 SYN_SENT 상태
- 서버가 클라이언트에게 SYN(SYN 응답) + ACK(ACKnowledgment, 연결 수락) 플래그 전송
- 서버는 SYN_RECEIVED 상태
- 클라이언트는 서버에게 ACK(ACK 응답) 플래그 전송
- 클라이언트와 서버는 ESTABLISHED 상태
- 3 way handshake
- 데이터 전송
- 확인 응답을 통해 송수신을 확인하여 송수신 신뢰성 보장
- 연결 종료
- 4 way handshake
- 클라이언트가 서버에게 FIN(연결 종료) 플래그 전송
- 클라이언트는 FIN-WAIT 상태
- 서버는 ACK 플래그 전송하고 통신이 끝날 때까지 대기
- 서버는 CLOSE_WAIT 상태
- 서버는 연결을 종료할 준비가 되면 클라이언트에게 FIN 플래그 전송
- 서버의 상태는 LAST-ACK 상태
- 클라이언트는 서버에게 ACK 플래그 전송
- 클라이언트는 TIME-WAIT 상태
- 클라이언트는 서버가 FIN 패킷 전에 보낸 패킷이 FIN 패킷보다 늦게 수신되는 것을 대비해 일정 시간 TIME-WAIT 상태로 대기
- 클라이언트는 일정 시간 후에 CLOSE 상태
- 클라이언트는 TIME-WAIT 상태
- 클라이언트가 서버에게 FIN(연결 종료) 플래그 전송
- 4 way handshake