네트워크 데이터 단위
데이터의 단위로 Packet이라는 것이 있다.
Packet을 얘기하기전에 앞서 Osi 7 Layer에서 5,6,7 계층은 통으로 잡아 Socket 수준이고 Kernel을 추상화한 인터페이스가 file인데 이를 Socket이라 말했었다.
파일입출력(File I/o)의 길이를 생각해보자. 만약 ms word에서 10줄짜리를 저장했을 때 3kb라면 더쓰면 용량이 더 늘어날 것이다. 그럼 얼마까지 늘어날까?
File이라는 단어가 나오면 기본적으로 Socket이기때문에 Stream 이다라고 생각하면 된다. (방송 스트리밍할때 그 스트리밍임)
중요한건 Stream은 어떻게 개발되었냐에 따라 길이가 굉장히 길어질 수도 있다는것이다. (IP수준에서 논하는 단위보다 길어질 수도 있다.)
막간의용어 정리
즉, 일정길이로 잘라버리는 분해가 일어난다.
이때 일정길이의 최대크기는 MSS(Maximum Segment Size)이다.
그런데 이 MSS는 Packet의 크기에 기초해서 만들어진다. 이 Packet의 최대크기를 MTU(Maximum Transport Unit) 라고 한다. 그리고 MTU는 특별한 이유가없다면 보통 1500bytes이다.
그럼 1.5메가바이트 정도되는 Stream 데이터를 인터넷으로 보내려면 몇개의 Packet이 나올까? 대략 천 몇백개쯤 나올것이다.
이 Packet이라는게 또 Frame으로 인캡슐레이션(encapsulation) 된다.
패킷의 생성 원리
TCP라는 요소를 User 모드 어플리케이션 Process가 접근할 수있도록 추상화한 인터페이스가 Socket이다라는걸 계속해서 말해왔다.
File의 일종인 Socket이기에 모든 프로그램은 이 File에 읽던지 쓰던지 입출력을 한다. 이때 중요한건 데이터의 단위이다.
Socket 수준에서 쓰는 데이터의 단위는 Stream이라 한다. Stream이라는 데이터는 시작이 있고 끝은 개발자의 마음대로이다.
트래픽이 TCP로 내려갈 때 stream 단위를 Segment라는 일정단위로 자르고 Segment가 인캡슐레이션되면 Packet이라 부르고 이 Packet이 한번더 인캡슐레이션되면 Frame이라 부른다.
그러면 Packet은 어떻게 생성될까?
User모드 프로그램을 개발하는, 소위 Socket 프로그래밍을 통해서 자바로든 C++이든 개발하면 Stream 데이터를 네트워크에 보낸다고 Send를 보내는순간 Segmentation 즉 분해가 일어난다.
Packet의 생김새는 길이가 MTU라는 1500byte가량되는데 이 Packet은 크게 둘로 나뉜다 Header 부분과 Payload. 또 이 Header는 다시 IP(L3), TCP(L4) 둘로 나뉜다.
특별한 이유가 없다면 IP도 20byte TCP도 20byte이다. 그렇다면 payload는 1500 -40인 1460이 MSS가 된다. 그러니까 Stream 데이터가 있으면 1460 씩 댕겅댕겅 자르고 payload로 넣어버리고 그앞에 header를 붙인 것이다.
보안때문이든 뭐든 Packet이라는 것을 조사하는것을 DPI(Deep Packet Inspection)이라한다. (함부로하면 안된다)
Segment라고 하는것은 택배에 들어있는 내용물과 같다. 내용물을 택배박스에 넣는 것을 인캡슐레이션이라고 한다.
Process가 Socket에다가 입출력을 시도하면 메모리에 저장된 Stream형식의 길다란 데이터를 일정단위로 Segment화 한 후에 Packet형식으로 인캡슐레이션되서 생성된다.
Frame이라는 것은 택배박스를 실는 택배차량으로 생각하면 이해하기 쉽다.
Segment는 L4 수준의 단위
Packet은 L3 수준의 단위
Frame은 L2 수준의 단위