• TCP Header

    2015. 6. 19.

    by. xxx123

     

     

    1. TCP 해더의 구조

     

     

    TCP Header의 구조는 위 그림과 같다.

    Options (가변길이) 필드를 제외한 순수 Header사이즈는 20byte이다.

    여기서 특이한 부분이 Header Length 필드가 4bit라는 점인데, 4bit로 표현할 수 있는 수는 16이 한계이다.

    그렇다고 최대 header 길이가 16bit인것은 아니다.

    실제로 header 길이는 4byte단위로 표현되므로 bit값이 1이라면 4byte, 2bit라면 8byte가 되는 셈이다.

     

     

     

     

     

     

    2. 와이어 샤크에서 본 TCP

     

    위에선 Header Length 필드에 대해서만 얘기를 했는데. 와이어샤크를 통해 예를 들며 각 필드를 조사해 보자.

    위 그림도 함께 참고 할것.

     

    패킷을 까보면 헤더의 내용이 각각 잘 표시되어 있다.

     

    [Source Port / Destination Port]

    자신 및 상대의 Port

     

     

    [Sequence Number]

    일명 SEQ, 순차 번호, 고유의 번호를 갖는다. 이값으로 TCP 세그먼트에 대한 식별값을 제공하며,

    통신 스트림 일부가 분실되면 확인을 위해 사용된다.

    이 번호는 패킷에 포함되어 있는 데이터사이즈만큼 증가한다.

     

    위 그림에서 Header Length가 32이므로,

    기본 TCP Header 20byte를 제외한 나머지 12byte가 Option값이라는 것을 알 수 있다.

     

     

    [Acknowledgment Number]

    일명 ACK, 확인 응답 번호, 다음번에 기대되는 SEQ를 표시한다.

     

     

    [Header Length]

    TCP 헤더의 길이. 옵션값 때문에 가변적이다.

     

     

     

    다음은 플래그 필드이다. 플래그 필드의 각 뜻은 다음과 같다.

     

    [ECHO]

    전송 경로 중에 Congestion이 발생 했을때 사용한다.

     

    [UGR]

    긴급하게 처리하라는 의미의 비트. 이 플래그가 활성화 된 패킷을 받으면 다른 일을 멈추고 이 데이터 부터 처리한다.

     

    [ACK]

    데이터를 받은 쪽의 버퍼가 차면 버퍼를 처리하면서 마지막까지 잘 받았으니 다음 것을 보내달라고 ACK를 보낸다. 중간에 데이터를 못 받았을 경우에도 어디서부터 보내달라는 신호로 ACK를 보내기도 한다.

     

    [PUSH]

    TCP의 경우, 수신측은 데이터를 버퍼에 다 채워야 어플리케이션으로 데이터를 넘겨준다. 중간에 못받은 데이터가 있을 수 있으니 다 받은걸 확인하고 올려주는 것이다. PUSH 플래그가 셋팅된 데이터가 들어오면 버퍼가 다 차지 않아도 TCP는 데이터를 어플리케이션에게 넘겨준다.

     

    [RST]

    세션을 강제 종료 시키는 의미로 많이 알고있지만 실제로는 세션에 할당된 메모리 자원을 NULL상태로 만들고 시스템에 반납하라는 내용의 플래그이다.

     

    [SYN]

    상대방과의 연결을 맺기 위해 던지는 플래그.

     

    [FIN]

    정상적으로 세션의 종료를 하고자 할때 사용하는 플래그.

     

     

     

     

    [Window size value]

    16bit로 이루어져 있어서 65535byte까지 표시 할 수 있다. 즉, 윈도우 최대 사이즈는 64kb라고 할 수 있다.

    하지만 1Gbps, 10Gbps 시대인 요즘엔 전송할 데이터의 양이 많아지고 있어서 이 최대값이 변경가능하도록 되었다.

     

     

     

     

     

    [참고]

    http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/TCP_Header

     

    'Programming > Network' 카테고리의 다른 글

    SO_SNDBUF 0  (0) 2016.12.04
    page-locking & non-paged pool  (0) 2015.06.19
    shutdown()과 closesocket()  (1) 2015.06.15
    IOCP - 1 (I/O CompletionPort)  (0) 2014.12.14
    Overlapped I/O  (0) 2014.09.18

    댓글