❏ TCP
❍ 전송 제어 프로토콜(Transmission Control Protocol)은 인터넷 프로토콜 스위트(IP)의 핵심 프로토콜 중 하나로, IP와 함께 TCP/IP라는 명칭으로도 널리 불립니다. TCP는 근거리 통신망(LAN)이나 인트라넷, 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟을 한정적으로, 순서대로, 에러 없이 교환할 수 있게 합니다. OSI 7계층의 전송 계층(Transport Layer)에 위치합니다.
❍ TCP는 기본적으로 IP와 함께 사용되어 TCP/IP라고 불립니다. IP 프로토콜의 상위 레벨 프로토콜로써, IP가 제공하지 못하는 기능 즉, 데이터 누락검사, 패킷 순서 뒤바뀜 등 데이터 교정과 관련된 기능을 수행합니다. 이러한 TCP의 기능상 특징으로 흔히 TCP를 ‘신뢰성 있는 프로토콜’, 또는 ‘연결지향 프로토콜’이라고 합니다. TCP는 하나의 연결을 통해서 읽기와 쓰기를 모두 할 수 있는 Full-duplex 방식의 통신을 지원합니다.
❏ TCP Header 구조
❍ TCP 헤더 구조
- Source Port / Destination Port
• Source Port는 메시지를 보내는 측에서 통신을 위해 사용하는 Port 번호
• Destination Port는 목적지, 즉 메시지를 받는 측의 통신 Port 번호
• Port 번호의 크기는 16bit이며 네트워크 어플리케이션은 0~65536중 하나의 포트를 이용해서 데이터 통신을 합니다.
- Sequence Number
• TCP 세그먼트 안의 데이터의 송신 바이트 흐름의 위치를 가리킵니다. 다른 호스트로 전달되는 세그먼트는 여러 개의 서로 다른 경로를 거치며 세그먼트의 순서가 뒤바뀔 수 있습니다. 이를 수신 측에서 재조립하기 위해 사용되는 Number입니다.
• SYN Flag가 1인 경우, 이것은 초기 Sequence Number가 되며 실제 데이터의 최초 바이트 값과 그에 상응하는 ACK 번호는 이 값에 1을 더한 값이 됩니다. SYN Flag가 0인 경우, 이것은 현재 세션의 이 세그먼트 데이터의 최초 바이트 값의 누적 Sequence Number 입니다.
- Acknowledgment Number
• 수신자의 입장에서 송신자로부터 앞으로 받아야 할 다음 데이터의 Sequence Number입니다. 이는 모든 선행하는 바이트들(존재할 경우)에 대한 수신에 대한 확인응답이 됩니다. 한 쪽이 보낸 최초의 ACK는 반대 쪽의 초기 Sequence Number 자체에 대한 확인응답이 되며, 데이터에 대한 응답은 포함되지 않습니다.
- Data Offset
• 32-bit(4-byte) 워드 단위로 나타낸 TCP 헤더 크기 값입니다. 헤더의 최소 크기는 5워드(20byte), 최대 크기는 15워드(60byte)이며, 헤더에 Options 값에 의해 최대 40byte가 추가될 수 있습니다.
- Rserved
• 미래에 사용하기 위해 남겨둔 예비 필드이며 0으로 채워져야 합니다.
- Flags (9bits) (혹은 Control bits)
• Segment의 용도와 내용을 결정하기 위해서 사용됩니다.
• NS : ECN-nonce 은폐 보호 (RFC 3540에 의해 헤더에 추가)
• CWR : 혼잡 윈도 축소(Congestion Window Reduced) 플래그는 송신 측 호스트에 의해 설정되는 것으로, 호스트가 ECE Flag가 포함된 TCP 세그먼트를 수신했으며 혼잡 제어 메커니즘에 의해 응답했음을 알리는 역할을 합니다. (RFC 3168에 의해 헤더에 추가)
• ECE : ECN-Echo는 다음을 나타냅니다.
(1) SYN Flag가 1로 설정된 경우, TCP 상대가 명시적 혼잡 통지(Explicit Congestion Notification, ECN)가 가능함을 의미합니다.
(2) SYN Flag가 0로 설정된 경우, IP 헤더 셋에 혼잡 경험(Congestion Experienced) Flag가 설정된 패킷이 정상적인 전송 중에 수신되었다는 것을 의미합니다. (RFC 3168에 의해 헤더에 추가)
• URG : Urgent Pointer 필드의 값이 유효함을 나타냅니다. URG Flag가 설정된 패킷을 받은 운영체제는 SIGURG 시그널(:12)을 발생시킵니다.
• ACK : Acknowledgment 필드의 값이 유효함을 나타냅니다. 클라이언트가 보낸 최초의 SYN 패킷 이후에 전송되는 모든 패킷은 이 플래그가 설정되어 있어야 합니다.
• PSH : 푸시 기능. 수신 어플리케이션에 버퍼링된 데이터를 푸시해 줄지 여부를 질의하는 역할을 합니다.
• RST : 커넥션 리셋. 비트가 설정되어 있을 경우 받은 호스트는 즉시 연결을 끊습니다.
• SYN : 동기화 Sequence Number. 양쪽이 보낸 최초의 세그먼트에만 이 Flag가 설정되어 있어야 합니다.
• FIN : 남은 송신측 데이터 없음을 의미하며 정상종료를 원하면 FIN Flag를 설정합니다.
- Window Size
• 해당 세그먼트의 송신 측이 현재 수신하고자 하는 수신 윈도의 크기를 나타내며 기본 단위는 바이트 입니다. 16bit로 되어있으므로 65535 byte 즉, 최대 크기는 64Kbyte가 됩니다. 1Gbps 이상의 속도가 되면 이 값을 Shift시켜 크게 만들어 사용합니다.
- Checksum
• 헤더 및 데이터의 에러 확인을 위해 사용되는 16bit 입니다. TCP Segment Data 송신 도중 발생될 수 있는 비트 오류를 검출하기 위해 사용됩니다. 송신자는 Checksum 계산알고리즘에 의해 계산한 체크섬을 TCP Checksum 헤더에 삽입하여 송신하게 되며, 수신자는 동일 알고리즘으로 수신받은 데이터를 검사해 봄으로써 오류 여부를 파악합니다. TCP Checksum 계산에 사용되는 헤더 및 데이터를 16비트 단위로 분할하여 비트 합을 구한 뒤, 이에 대한 1의 보수를 취함으로써 계산되며 비트합 계산 중 carry가 발생될 경우 warp around를 적용합니다.
- Urgent Pointer
• URG Flag가 설정된 경우 긴급 메시지를 보냅니다. Urgent Pointer는 일반 데이터 내에서 긴급 데이터가 시작되는 위치 정보를 가지고 있습니다.
- Options
• TCP 헤더의 정보를 좀 더 확장시키고자 할 때 사용합니다. 이 부분은 Option-Kind(1 byte), Option-Length(1 byte), Option-Data (가변) 이렇게 최대 3개의 필드로 구성될 수 있습니다. Option-Kind 필드는 옵션의 종류를 나타내며, 세 가지 필드 중 유일하게 필수 값입니다. 옵션의 종류에 따라 나머지 두 개의 필드가 설정될 수 있습니다. Option-Length 필드는 옵션의 전체 길이를 나타내며 Option-Data 필드는 적용 가능한 경우 해당 옵션의 값을 나타냅니다.
Kind |
Length |
Name |
Descripion and Purpose |
0 |
1 |
EOL |
End of Option List |
1 |
1 |
NOP |
No Operation (used for padding) |
2 |
4 |
MSS |
Maximum Segment Size |
3 |
3 |
WSOPT |
Window Scaling Factor (left-shift amount on window) |
4 |
2 |
SACK-Permitted |
Sender supports SACK opions |
5 |
Var |
SACK |
SACK block (out-of-order data received) |
8 |
10 |
TSOPT |
Timestamps option |
28 |
4 |
UTO |
User Timeout (abort after idle time) |
29 |
Var |
TCP-AO |
Authentication option (using varius algorithms) |
253 |
Var |
Experimental |
Reserved for experimental use |
254 |
Var |
Experimental |
Reserved for experimental use |
ㆍNOP : 필요시 송신측이 필드를 4바이트의 배수가 되도록 채우기 위한 옵션입니다.
ㆍEOL : 처리해야 할 더 이상의 옵션 목록이 업는 리스트의 끝임을 알립니다.
ㆍMSS : 송, 수신 시 사용할 수 있는 가장 큰 세그먼트 크기입니다. MSS는 TCP와 IP의
더를 제외한 오직 TCP 데이터 바이트만 계산합니다. 연결이 설정되면 각 종단은 자신의 SYN 패킷과 함께 MSS 옵션을 통해 자신의 MSS를 상대에 알리며, 통신의 중간에는 MSS 크기는 변경이 불가능합니다. IPV4에서 일반적인 MSS 값은 1460(1518- 18(이더넷헤더) - 20(IP헤더 - 20(TCP헤더))bytes입니다. MSS 옵션은 송, 수신 측의 협상이 아닌 제한된 값으로서 MSS 크기 이상의 세그먼트는 허용하지 않습니다.
ㆍSACK(Selective Acknowledgement) : 송, 수신 호스트가 SACK 기능을 지원함을 나타냅니다.
ㆍWSOPT : Window Size값을 왼쪽으로 쉬프트하여 크기를 늘리는 옵션입니다.
ㆍTSOPT : RTT 값을 계산하기 위한 옵션으로 PAWS(Protection Against Wrapped Sequence Number)에도 사용될 수 있습니다.
ㆍTCP-AO : TCP 연결의 보안을 향상시키기 위한 옵션으로 아직은 사용하지 않습니다.
- Padding
• TCP 헤더 패딩은 TCP 헤더의 종료 지점과 데이터의 시작 지점을 32비트 단위 길이에 맞추기 위해 사용되며 패딩의 값은 0입니다.
'개발 노트 > 네트워크' 카테고리의 다른 글
[프로토콜] IP Header (0) | 2018.11.05 |
---|---|
[프로토콜] UDP Header / UDP 동작 (0) | 2018.10.30 |
[프로토콜] TCP 통신 (0) | 2018.10.28 |
[프로토콜] TCP 프로토콜 동작 방식 (0) | 2018.10.27 |
[프로토콜] TCP Checksum (TCP 체크섬) (0) | 2018.10.25 |