본문 바로가기

개념정리/네트워크

[네트워크] 04-03. TCP 프로토콜


 

04-03. TCP 프로토콜

 

[기능]

 - Transmission Control Protocol, 전송 제어 프로토콜

 - 안정적으로, 순서대로, 에러 없는 연결을 지향

 - UDP보다 안전하지만 느림

 

 

[구조]

1 2 3 4 Byte
Source Port Destination Port 4
Sequence Number 8
Acknowledgment Number 12
Offset Reserved TCP Flags Window 16
Checksum Urgent Pointer 20
TCP Option (개당 4byte) 24~

 - 20 바이트+α (옵션에 따라)

 - Source Port : 출발지 포트번호

 - Destination Port : 목적지 포트번호

 - Sequence Number : 패킷의 순서번호 (패킷 신뢰성 및 흐름제어, 초기번호 랜덤, 동기화 후 Seq번호=수신 Ack 번호)

 - Acknowledgment Number : Sequence number에 대한 응답 번호 (Seq 번호 + 수신 payload 크기 || 1), 초기번호 0

 - Offset : 헤더 길이(최소 20, 최대 60) ÷ 4의 값 ≫ (0x5 ~ 0xF)

 - Reserved : 예약된 필드 (사용하지 않음) 

 - TCP Flags : 연결의 종류를 지정하는 8비트 플래그 옵션, 0b00000000 C E U A P R S F  

    ◎ U(Urgent) : 긴급비트, 우선순위가 높은 데이터임을 표기, Urgent 포인터와 세트 ( 0b00100000 )

    ◎ A(Ack) : 승인비트, Acknowledgment 요청에 대한 승인 응답을 나타냄, ( 0b00010000 )

    ◎ P(PSH) : 밀어넣기 비트, Push, TCP 버퍼가 찰 때까지 기다리지 않고 데이터를 밀어넣겠다  ( 0b00001000 )

    ◎ R(RST) : 초기화 비트, Reset, 연결 상태 초기화( 0b00000100 )

    ◎ S(SYN) : 동기화비트, Synchronize, 상대와 연결을 시작할 때 무조건 사용, 연결상태 동기화 ( 0b00000010 )

    ◎ F(FIN) : 종료비트, Finish, 연결을 끊을 때 사용 ( 0b00000001 )

* TCP buffer : 일정한 크기만큼 데이터를 쌓아서 전송

 - Window :  통신상대에게 TCP 버퍼(사용 가능한 공간)가 얼마나 남아있는지 알려줌 ( ~~ 만큼 더 보내 )

 - Checksum : 헤더 오류 확인(필드값 계산 후 세팅 후 전송 ≫ 받는 쪽에서 다시 계산 후 확인) 

 - Urgent Pointer : 긴급 데이터의 위치를 가르킴

 - TCP Option : 옵션이 증가할 때 마다 4바이트씩 추가됨 (최대 10개 ≫ 40 Byte가 추가로 붙을 수 있다)  

 

 

[통신과정]

1. 연결수립과정 3way handshake

 - TCP를 이용한 데이터 통신에서 프로세스와 프로세스를 연결하기 위해 가장 먼저 수행하는 과정

 1) 클라이언트 → (요청패킷)  서버 (SYN 플래그 2 세팅 0x02)

 2) 서버 ← (요청 수락 패킷)  클라이언트 (ACK 플래그 16 + SYN 플래그 2 세팅 0x12)

 3) 클라이언트 → (최종 수락 패킷) → 서버 (ACK 플래그 16 세팅 0x10)

 * 이 때는 단순 연결수립 과정이기 때문에 TCP 뒤에 payload가 없다

 

2. 데이터 송수신과정

 - 연결이 완료된 후 HTTP나 FTP같은 각종 데이터를 포함한 통신

 - 연결수립 과정의 마지막 Seq 번호와 Ack 번호에서 이어간다

 - 보낸 쪽에서 또 보낼 때는 Seq 번호와 Ack 번호가 동일

 - 응답측 Seq 번호 = 이전에 수신한 Ack 번호

 - 응답측 Ack 번호 = 이전에 수신한 Seq 번호 + 데이터 크기  

 

 

[상태 전이도]

실선: 클라이언트 / 점선: 서버

 - Listen : 서버가 포트를 열어놓은 상태, 언제든지 연결 가능 

 - Established : 서버와 클라이언트간의 연결이 수립된 상태 ( 3 way handshake 이후 )