TCP 세그먼트 구조

 세그먼트란 "단편, 조각"이라는 뜻을 가진 영어단어이고 TCP 세그먼트란 TCP를 이용해서 전송 되는 데이터 단위를

 뜻합니다. 

TCP 헤더

TCP 세그먼트에 대한 설명

필드명 한글명 설  명
Source port address 출발지 포트 TCP 세그먼트를 보내는 출발지의 포트 번호. 16비트 값을 가지며 클라이언트가 서버로 보낼 때는 임시 포트번호를 할당받아 사용하고, 서버의 경우 지정된 포트번호를 사용합니다.
Destination port address 목적지 포트 TCP 세그먼트를 받는 목적지의 포트번호. 
Sequence number 순서 번호 정상적인 송신이 경우 이 세그먼트에서 보내는 보내는 첫 번째 바이트의 순서 번호입니다. 연결 요청(SYN) 메시지의 경우 출발지 TCP가 사용할 ISN입니다.
Acknowledge number 승인 번호 ACK 비트가 설정되면 세그먼트는 승인 기능을 가집니다. 승인이란 송신한 데이터에 대한 수신에 했다는 응답을 말합니다. 승인번호를 통해서 상대방이 데이터를 수신했다는 확인이 가능합니다.
data offset 데이터 오프셋 TCP 헤더에 있는 데이터를 32비트 워드(word) 단위로 나타냅니다. 워드는 4바이트이기 때문에 이 값의 4의 배수는 헤더의 크기를 바이트로 나타냅니다. TCP의 헤더는 가변적이기 때문에 이 값이 필요합니다.
Reservation 예약 이 필드를 나중에 사용하게 위해서 예약되어 있습니다. 
TCP flag 제어 비트 TCP는 제어 메시지를 따로 두지 않고 제어 비트를 설정해서 제어 메시지를 보내는데 비트설정을 위한 필드입니다. 내용은 아래의 표에서 자세히 설명합니다.
Window size 윈도우 크기 세그먼트의 송신자가 수신자에게서 한번에 받을 수 있는 옥텟(바이트) 수를 알립니다. 이필드 값은 대체로 이 연결에서 발생하는 데이터를 수용하기 위해 할당된 버퍼의 현재 크기입니다. 
Checksum 체크섬 데이터 무결성 보호를 위한 16비트 체크섬입니다. TCP는 전체 TCP 데이터와 가상 헤더를 사용해서 체크섬을 계산합니다.
Urgent pointer 긴급 포인터 이 필드는 URG 제어 비트와 함께 사용합니다. 이 필드는 긴급 데이터의 마지막 바이트가 가지는 순서 번호입니다.
Option 선택사항  
Padding 패딩 선택사항 필드가 32비트가 아니라면 0으로 채워서 32비트의 배수가 되도록 합니다. 
Data 데이터 세그먼트로 전달 하는 데이터

제어 비트에 대한 설명

필드명 설  명
URG 긴급 비트, 비트가 켜지면 세그먼트에 우선 순위가 높은 데이터가 있다는 뜻을 가집니다. 긴급 포인터 필드 값을 사용합니다.
ACK 승인 비트, 비트가 켜지면 세그먼트에 승인이 포함된다는 뜻으로 승인 번호 필드값은 세그먼트 목적지가 다음에 보내야 할 순서번호를 가르킵니다.
PSH 밀어 넣기 비트, 세그먼트의 송신 장비가 TCP 밀어 넣기 기능을 사용했으므로 세그먼트를 받는 즉시 애플리케이션으로 송신하라는 뜻입니다.
RST 초기화 비트, 송신 장비에 문제가 발생 했으니 연결을 초기화 하라는 뜻입니다.
SYN 동기화 비트, 순서번호를 동기화 하고 연결 수립을 요청하는 세그먼트입니다. 
FIN 종료 비트, 세그먼트의 송신 장비가 연결 종료를 요청한다는 뜻입니다. 

SYN나 FIN, ACK는 TCP의 연결 수립 및 종료에 사용한 예제를 이전 글에서 보여드렸습니다. 

제어 비트는 총 6비트로 설정 되어 있으며 비트 플레그로 동작하기 때문에 동시에 여러 비트가 켜져 있을 수도 있습니다. 

TCP 체크섬 계산

 TCP는 IP 네트워크에 있는 한 쌍의 장비 사이에서 신뢰 할 수 있는 데이터 송신을 제공하기 위해서 설계 되었습니다. 

 데이터가 에러가 생긴 채 수신 될 경우 수신 장비에서 에러 발생을 확인 할 수 있도록 TCP 헤더에 체크섬

 필드를 둡니다.

 TCP 가상 헤더 

 TCP는 TCP 세그먼트이 실제 데이터 필드만 체크섬 계산하지 않고 체크섬 계산 전에 TCP 가상 헤더를 만듭니다. 

 가상헤더에는 IP의 헤더 필드값을 가져온 중요한 정보도 포함됩니다. 

출발지 주소(IP 헤더에서 추출)
목적지 주소(IP 헤더에서 추출)
예약됨 프로토콜(IP 헤더) TCP 세그먼트 길이
필드명 설명
출발지 주소 IP 헤더에서 알아낸 데이터그램을 송신하는 장비의 IP 주소( 예제. 220.15.85.12)
목적지 주소 IP 헤더에서 알아낸 데이터그램을 수신 할 장비의 IP 주소
예약 8비트 모두 0이다.
프로토콜 IP 헤더에서 알아낸 프로토콜 필드값. IP 데이터 그램이 전송하는 상위 계층 프로토콜을 나타냄 TCP는 일반적으로 6을 가집니다.
TCP 길이 TCP 헤더와 데이터를 포함한 총 세그먼트의 길이, TCP 헤더에 명시되지 않아서 따로 계산합니다.

가상 헤더는 총 96비트로 버퍼에 저장되며 체크섬 계산할 대 TCP 세그먼트 앞에 덧 붙는다. 그 후 전체 데이터

(가상헤더 + TCP 세그먼트)에 대해서 체크섬이 계산되고 체크섬 필드에 값이 저장되면 가상 헤더는 버린다. 

가상 헤더는 실제로 전송되어지지 않는다. 목적지에 TCP세그먼트가 도착 하면 동일한 계산을 진행합니다. 

계산값이 체크섬 필드와 다르면 어딘가에서 에러가 발생했다는 뜻이므로 수신 TCP 세그먼트를 버립니다. 

TCP 최대 세그먼트 크기(MSS)

 MSS란 세그먼트가 가질 수 있는 최대의 크기를 말합니다.(헤더의 크기는 포함하지 않습니다.)

 TCP의 데이터 필드에는 실제로 송신할 데이터가 들어가는데 데이터 필드의 길이는 가변입니다. 그러면 데이터 필드의 

 길이를 최대를 어떻게 설정해야지 효율적일지 고민을 해봐야 합니다.

MSS의 성능을 위한 고려사항

 과부화 관리 : TCP 헤더는 최소 20바이트를 가진다. IP 헤더도 20바이트 이상을 가지니 최소 40바이트의 데이터와

 상관없는 비용이 필요합니다. MSS를 너무 적게 셋팅한다면 데이터 전송이 비효율적입니다. 예를 들어서 MSS를 40으로

 설정한다면 50%를 헤더 비용으로 사용하게 됩니다. 

 IP 단편화 : TCP 세그먼트는 IP 데이터 그램으로 묶입니다. 데이터 그램은 크기의 한계가 있으며 하위 네트워크의

 최대 송신 단위(MTU) 이상은 송신 할 수 없습니다. 만약에 TCP 세그먼트가 너무 크다면 단편화 하지 않고

 데이터 그램으로 송신 할 수 없습니다. 단편화를 사용하면 효율이 떨어지고 데이터의 유실 확률도 높아집니다. 

TCP 기본 MSS

 과부화 관리와 IP 단편화문제를 해결 하기 위해서 기본 MSS는 단편화 없이 송신 될 수 있는 최대 크기로 정했습니다. 

 IP 네트워크의 최소 MTU인 576바이트를 기준으로 IP헤더 20바이트, TCP헤더 20바이트를 제외한 536바이트

 기본 MSS로 사용합니다. 이 값은 어떤 IP 네트워크에서도 단편화 없이 송신을 할 수 있는 크기입니다. 

TCP RFC 879

TCP Maximum Segment Size를 위한 RFC 879 문서의 위치를 링크합니다. 

https://www.ietf.org/rfc/rfc0879.txt

 

+ Recent posts