티스토리 뷰

TCP/IP 패킷의 구조

TCP or UDP / IP 패킷의 전체적인 구조

패킷의 전체적인 구조.. 좀 복잡해 보이죠? 컴퓨터 간의 통신이란 게 상당히 정교한 약속(프로토콜)으로 이루어져 있습니다. 그래서 전체적인 구조를 한 번에 파악하긴 상당히 힘들죠.. 그래서 OSI 7 계층을 참고하여 각 계층별 패킷 구조와 연관하여 하나하나씩 알아가 봅시다! 만약 OSI 7 계층에 대한 지식이 없으시다면 아래 링크에서 자세하게 확인하실 수 있습니다!

 

OSI 7 계층 : https://southern-island.tistory.com/1

 

[ Network ] OSI 7 계층 (OSI 7 Layer)

OSI 7 계층이란 무엇일까? 국제표준화기구 ISO에서 1984년에 네트워크 통신의 구조를 7 계층으로 구분하여 각 계층 간 상호 작동하는 방식을 정의해놓은 것이다. OSI 7 계층은 어떻게 구분되어 있을

southern-island.tistory.com

 

전체적으로 패킷이 만들어지는 과정

출처 : madplay.github.io/post/network-osi-7-layer

 

위의 사진은 제 첫 포스트인 OSI 7 계층에 대한 내용에 한번 살펴본 적이 있습니다. 우선 전달하려는 원본 데이터가 상위 계층에서 하위 계층으로 내려오면서 하나의 패킷을 완성하게 됩니다. 따라서 2 계층의 데이터 상태가 전달되는 패킷의 전체적인 구조와 일치하게 되는 것이죠.

 

2 계층 이더넷 헤더 (이더넷 프레임)

우선 첫 번째로 알아볼 헤더는 "Ether Header"라고 불리는 헤더입니다. 위 사진에서 주황색으로 표시해둔 바로 저 부분이죠, 아래의 IP 헤더나 TCP 헤더는 아직 신경 쓰지 않으셔도 됩니다. "Ether Header" 이하 이더넷 헤더는 2 계층에서 추가되는 헤더입니다. 한마디로 패킷을 전달하기 직전 마지막으로 추가되는 헤더인 것이죠. 한번 이더넷 헤더를 자세히 알아볼까요? 

 

출처 : https://commons.wikimedia.org/wiki/File:Ethernet_Type_II_Frame_format.svg

 

우선 이더넷 헤더는 MAC 헤더와 데이터(Payload), CRC로 구성되어 있습니다. 데이터엔 7 계층부터 3 계층까지 내려오면서 (원본 데이터 + 여러 헤더)의 정보가 오게 됩니다. MAC 헤더의 설명에 앞써 실질적인 데이터 송수신은 IP를 통해 하지 않습니다. IP는 3 계층의 프로토콜이며, 실질적인 데이터 송수신의 랜카드의 고유번호인 MAC(2 계층)을 통해 진행하게 됩니다. 따라서 최종 헤더인 이더넷 헤더에서 MAC에 대한 정보가 들어가게 되는 것이죠. 하지만 IP만 서로 알고 있는 상황에서 어떻게 서로의 MAC 주소를 알 수 있을까요? 이는 ARP(Address Resolution Protocol)라는 것을 통해를 IP를 MAC으로, RARP(Reverse Address Resolution Protocol)라는 것을 통해 MAC 주소를 IP로 바꿀 수 있습니다. ARP에 대한 자세한 내용은 ARP 스푸핑에 관한 포스트를 진행할 때 자세히 설명해드리겠습니다, 우선은 ARP라는 것을 통해 MAC 주소를 알 수 있고, ARP는 3 계층이라는 사실만 알고 가시면 됩니다. "EtherType"은 이더넷 헤더 뒤에 이어지는 헤더 형식을 지정합니다. IP, ARP, RARP 등이 있습니다. 만약 IP 헤더라고 설정되어 있다면 아래의 IP 헤더가 추가되게 되는 것이죠.

 

3 계층 IP 헤더

우선 두 번째로 알아볼 헤더는 "IP Header"라고 불리는 헤더입니다. 위 사진에서 주황색으로 표시해둔 바로 저 부분이죠, IP 헤더가 추가된 데이터(Payload)는 하위 계층의 이더넷 헤더의 Payload의 위치에 오게 됩니다. 당연히 상위 계층인 TCP/UDP 헤더 또한 IP 헤더의 Payload의 위치에 오게 되는 것이죠. IP 헤더에 대해 자세히 알아보겠습니다.

 

음.. 뭔가 많이 복잡해졌습니다. 아무래도 3 계층의 IP는 라우팅 경로 확보, 단편화와 재조립 등을 진행하기 때문에 많은 헤더가 필요한 것 같습니다. 그럼 하나씩 알아보도록 하죠! 우선 Version입니다. Version은 IP 버전에 대한 정보가 있습니다. IPv4, IPv6가 그 주인공들이죠, 하지만 아직까지도 실제 통신엔 IPv6 보단 IPv4를 많이 사용합니다. 따라서 일반적으로는 버전 4의 정보가 저장되어 있습니다. 두 번째로 IHL입니다. IHL는 IP 헤더의 길이입니다. 기본적으로 5의 값을 가지고 있고, 기본값(5) * 4를 통해 IP 헤더의 크기(바이트)를 구할 수 있습니다. 세 번째 Type of Service입니다. 현재는 Differentiated Services라는 이름으로 사용되고 있습니다. TOS에 대해선 아직 공부가 부족합니다.. 추후에 알게 된다면 포스팅을 수정해두겠습니다! Total Length는 헤더를 포함한 전체 데이터의 크기입니다. 따라서 (Total Length - (IHL * 4))식을 통해 Data의 크기를 확인할 수도 있습니다. 우선 Identification, Flags, Fragment Offset에 대한 내용은 좀 있다가 설명드리겠습니다. 단편화에 대한 이해가 필요하기 때문이죠.. Time To Live(TTL)은 패킷의 수명?입니다. TTL은 라우터를 한번 경유할 때마다 TTL의 값이 1씩 차감됩니다. 그렇게 TTL이 1이 된 패킷을 특정 라우터가 받게 된다면 받은 패킷을 폐기하고 ICMP 오류(type 11, code 0)를 수신자에게 송신하게 됩니다. 이는 정상적으로 수신되지 못한 패킷이 영원히 네트워크에 유령마냥 떠돌아다니며 네트워크 트래픽, 즉 네트워크 부화를 주지 않기 위해 설정됩니다. TTL값은 송신하는 OS의 종류에 따라 다르게 나타납니다. 대표적으로 Linux는 64, Windows는 128, Unix는 255입니다. Protocol은 상위 4 계층의 TCP, UDP, ICMP, IGMP 등의 프로토콜을 나타냅니다. 하지만 ICMP와 IGMP는 4 계층이 아니라 3 계층입니다. 이는 저도 정확하게 이해를 하지 못 했지만 ICMP와 IGMP는 3 계층이면서 3 계층인 IP 프로토콜에 의지합니다. 정확한 내용을 아시는 분은 덧글 부탁드리겠습니다! Header Checksum은 헤더의 오류를 검증하기 위해 사용됩니다. Source Address는 송신자의 IP주소가 Destination Address는 수신자의 IP주소가 세팅됩니다. Options는 새로운 실험 혹은 헤더 정보에 추가 정보를 표시하기 위해 설계되었습니다.

 

IP 패킷의 단편화

IP 패킷의 단편화의 이해는 위에서 설명하지 못했던 Identification, Flags, Fragment Offset에 대해 설명하기 위해 필요합니다. IP 패킷의 단편화란 데이터가 라우터를 통과하기 전 라우터의 MTU(Maximun Transmission Unit) 즉, 물리적인 네트워크 프로토콜 프레임 데이터부(Payload)의 최대 크기를 초과하지 않기 위해 데이터를 최대 크기 이하로 단편화하여 전송을 진행합니다. MTU의 크기는 라우터 장비에 따라 다르며 보통 1500 바이트입니다. 하지만 오래된 장비는 700처럼 더 낮은 값일 수도 있습니다.

출처 : https://en.wikipedia.org/wiki/IP_fragmentation

 

위의 사진처럼 만약 10000 Byte 짜리 Payload 즉 데이터를 전송했다고 가정하면, 특정 라우터를 경유해야 하는데 해당 라우터의 MTU의 값이 2500이라면 헤더를 제외한 데이터를 2500 바이트 크기 이하로 단편화 (나눠?) 데이터를 따로 전송하게 됩니다. 이때 IP 헤더의 Identification는 나눠진 데이터 조각이 같은 패킷의 데이터라는걸 인증하는 고유한 번호를 나타내게 됩니다. Flags 값은 분할된 추가 패킷이 있다는 것을 알려주며, 해당 정보를 바탕으로 수신 측에서는 재조합을 통해 원래의 패킷으로 완성합니다.

 

Flags에는 3개의 비트로 구성된 각 비트 별 옵션이 있습니다. 첫 0번째 비트는 예약 필드로 아무런 옵션이 없지만 무조건 0으로 세팅되어야 합니다.  1번째 비트인 Don't fragment(DF)을 1로 세팅하면 해당 패킷은 단편화를 하지 않겠다는 설정입니다. 만약 DF가 1인데 패킷의 데이터가 라우터의 MTU보다 크다면 해당 패킷을 폐기 후 ICMP 오류 (Type 3, Code 4)를 송신자에게 패킷을 단편화하여 송신하게 됩니다. 2번째 비트인 More Fragment(MF)는 아직 분할된 패킷이 더 남아있음을 알립니다. 따라서 분할된 패킷의 마지막 패킷을 제외한 모든 분할된 패킷은 MF값을 1로 세팅됩니다.

 

IP 헤더의 마지막인 Fragment Offset은 수신지에서 단편화된 패킷들을 재배열하는 과정에서 각 조각의 순서를 파악하는 데 사용됩니다. 만약 첫 단편화된 패킷의 데이터 크기가 2500이라면 첫 패킷엔 FO값이 0, 두 번째 패킷엔 2500, 세 번째 패킷엔 5000... 이런 식으로 증가하게 됩니다.

 

4 계층 TCP/UDP 헤더

해당 계층의 헤더는 아직 학습 중입니다. 추후에 업데이트하겠습니다!

 

마치며...

제가 글을 쓰는 가장 큰 이유는 배운 내용을 정리하고 나중에 다시 공부하기 위해서입니다, 따라서 잘못된 정보가 포함되어 있거나 중요한 내용이 빠져 있을 수 있습니다, 잘못된 내용이나 빠진 내용이 있는 경우 댓글로 말씀해주시면 정말 감사드리겠습니다!

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함