네트워킹 수업을 들을 때에도 관련 공부를 할 때에도 세그먼트니, 헤더니, tcp 헤더니,, 여러 용어들이 혼란스러워 힘들었고 늘 이런 불확실함으로 인해 100% 에 도달하지 못하고 97,98% 만 학습한 듯한 찝찝함이 남았었다,,!
때문에 이러한 세세한 부분도 가능한 정확히 이해하고 기초를 탄탄히 하는게 좋을 것 같아 이번 포스팅을 작성해 본다!
결론부터 말하자면 TCP 세그먼트는 세그먼트 헤더와 실제 데이터로 구성되어 있다!
TCP 프로토콜은 데이터 스트림으로부터 데이터를 받아들이고 이것을 일정 단위로 분할한 뒤 TCP 헤더를 덧붙여 TCP 세그먼트를 생성하고, 이렇게 만들어진 TCP 세그먼트는 IP 데이터 그램에 캡슐화 되어 상대방에게 보내지게 된다.
💡 IP 데이터그램이란?
IP에서 사용하는 패킷을 말한다, = IP PDU
💡 패킷이란?
컴퓨터 네트워크가 전달하는 데이터의 형식화된 블록이다
즉, 정리하자면
Segment = TCP 프로토콜 데이터 유닛 (PDU) 를 의미! & 데이터그램 = IP PDU 인 것이다!
위에서 설명한 TCP 세그먼트의 구조를 그림으로 살펴보자!
실제 보내려는 데이터는 보라색 Data 영역에 담겨지고
어디서 보내는지, 어디로 보내는지, 몇번째인지 등등의 정보들은 모두 하늘색 영역인 헤더 영역에 담겨지게 된다!
각 영역에 어떤 정보가 담기는지 보자면,
수신자는 쪼개진 세그먼트의 순서를 파악하여 올바른 순서로 데이터를 재조립 하게 된다. 송신자가 최초로 데이터를 전송할 때는 이 번호를 랜덤한 수로 초기화, 이후 자신이 보낼 데이터의 1byte 당 시퀀스 번호를 1씩 증가시켜 데이터의 순서를 표현한다
ex) 1MB 짜리 데이터를 100bytes 씩 보낼 때
송신자는 처음 100bytes 만큼만 데이터를 전송하면서 시퀀스 번호를 0으로 초기화한다. 시퀀스 번호는 1byte당 1씩 증가하기 때문에 100byte의 데이터를 전송하면 이 후 전송 받아야 할 시퀀스 번호는 100이 될 것이다!
data offset을 표기할 때는 32비트 워드 단위를 사용하며, 32비트 체계에서 1워드 = 4bytes를 의미하므로 data offset 필드의 값에 4를 곱하면 세그먼트에서 헤더를 제외한 실제 데이터의 시작 위치를 알 수 있게 된다!
4bit 가 할당되었으므로 표현할 수 있는 값의 범위는 0000~1111, 즉 0~15 word 이므로 기본적으로 0~ 60bytes의 오프셋까지 표현할 수 있다. 하지만 옵션 필드를 제외한 나머지 필드는 필수로 존재해야 하기 때문에 최소 값은 20bytes (5word)로 고정되어 있다!
TCP 의 체크섬은 전송할 데이터를 16 bits 씩 나누어 차례대로 더해가는 방법으로 생성
데이터 오프셋 필드는 20~60 bytes의 값을 표현할 수 있는데, 아무런 옵션도 사용하지 않은 헤더의 길이 (source port 부터 urgent pointer)가 20bytes 이고, 옵션을 모두 사용했을 때 옵션 필드의 최대 길이가 40bytes 이기 때문이다.
만약 데이터 오프셋 필드의 값이 5, 즉 20 bytes 보다 크지만 TCP 옵션을 하나도 사용하고 있지 않다면, 초과한 bytes 만큼 이 필드를 0으로 채워줘야 수신측이 헤더의 크기를 올바르게 측정할 수 있다.
이렇게 TCP 세그먼트의 구조와 각 영역의 역할에 대해 알아보았다!
매번 같은 내용이 아니라 자세한 설명이 담겨있는 포스팅을 찾아 다행이었다!