호스트에서 네트워크로 데이터를 보낼때 언제 어떻게 데이터를 쪼개는지 헷갈려서 작성한다.
process의 socket에서는 stream 형태로 데이터를 넘긴다.
이 때, stream 형태의 데이터가 segment 단위로 쪼개진다.
이후 layer3(TCP)에서 TCP header
+ segment
되고
layer4(IP)에서 IP header
+ TCP header
+ segment
되어 Packet
이 된다.
참고로 Segment는 TCP에서만 사용하며, UDP에서는 datagram이라고 한다.
layer 3에서 만들어진 ip 패킷은 원하는 호스트까지 전송되기 위해 MTU 값을 고려해서 만들어진다.
만약 패킷의 크기가 MTU 값보다 크다면, 패킷은 단편화(Fragmentation)되고, 마지막 호스트에서 재조립(Reassemble) 된다.
단편화되고 재조립되는 과정에서 비용이 들고 이는 효율을 떨어 뜨린다.
단편화는 가능한 발생하지 않는게 제일 좋으며,
2022년 현재 단편화는 거의 발생하지 않는다고 한다.
발생하는 경우는 VPN IPsec 때문에 발생한다고 한다.
(IP header가 하나 더 붙으면서 MTU를 초과하기 때문에)
단편화가 발생하는 예시)
pc1: 1500 MTU
router: 1400 MTU
pc2: 1500 MTU
pc1이 router를 거쳐서 pc2로 1500 byte의 IP 패킷을 보낼때 단편화가 발생한다.
단편화로 생기는 비효율성은 하향 평준화를 통해서 해결할 수 있다.
pc1과 pc2의 MTU를 1400으로 낮춤으로써 MSS 또한 줄이면 단편화가 발생하지 않는다.
기본적으로 MTU(Maximum transfer unit) 값은 1500 byte이다. 하지만 항상 그렇지는 않다.
MSS는 최대 세그먼트 사이즈로 MTU에서 TCP/IP 헤더(TCP/IP의 경우)를 제거한 것이다.
주로 1500byte - 최소 20byte - 최소 20byte = 1460byte의 사이즈를 갖는다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=coffsje76&logNo=220199132164