1. L3 Packet
Packet은 어떤 단위 데이터를 의미한다. L3의 Packet이 가장 대표적이며 L3 IP Packet이라고 부르면 좀 더 정확하다. Header와 Payload로 나뉘며 최대크기(MTU, Maximum Transmission Unit)은 1500 byte가 표준적이다.
강의를 따라 Wireshark를 통해 어떤 패킷의 16진수로 표현된 부분의 맨 앞부분을 클릭해봤다. 각각 Destination, Source 부분을 가르키며 이 부분이 (Ethernet) Header 부분이라고 한다.
Encapsulation, Decapsulation
패킷은 인캡슐레이션화 되어있다. 아래 그림처럼 L2 레벨에서부터 Header - Payload 구조로 되어있고, 그 Payload 내부에는 다음 L3 계층의 패킷이 Header - Payload 구조로 계속 중첩된 구조라고 이해하면 된다. 러시아의 마트료시카 인형처럼 여러번 중첩되어 감싸진 구조이다. 반대로 각 레이어에서 패킷을 해석할 때 Header를 분석하고 Payload를 꺼내게 되는데 이것을 Decapsulation이라고 한다.
패킷 전달과정의 이해
아래 그림처럼 택배를 보내고 받는 과정을 패킷 전달과정으로 비유하여 이해할 수 있다. 각 보내는 사람, 받는 사람은 Process로 비유된다. 각 Process가 Data를 보내고 받는 과정인 것이다. Box에 물품을 넣고, 송장을 붙이는 과정은 Encapsulation과 Header 정보 작성으로 이해할 수 있다. 특히, 택배 기사님이 택배를 받아서 화물차에 싣게 되는데, 택배 기사님이 패킷 전달과정에서는 Gateway이다. Gateway를 통해서 패킷이 송출되는 것을 알고 있어야한다. 그리고 화물차는 택배사의 복잡한 프로세스에 따라 택배를 이리저리 운송하게 되는데, 이 과정이 인터넷에서의 Routing 과정이라고 이해하면 된다. 마지막으로 받는이가 있는 집이 host, 송장에 붙은 받는이의 이름이 Port 번호가 된다.
계층별 데이터 단위
Process에서 Socket을 통해 Data를 write한다. 그러면 User mode에서 Kernel mode로 데이터가 전달된다. 이후 L4 TCP까지 내려가면 TCP Header가 붙으면서 Segment가 된다. 이후 L3에서 IP header가 붙고, L2에서 Ethernet header가 붙어서 Frame이 된다. 그 다음 L2 Access -> Router -> internet으로 가는 구조인 것이다. 현실에서는 Segment나 Packet이나 철저히 구분하지는 않고 전부 패킷이라고 부르는 경우가 많다.
Socket - Stream
그리고 Socket에서의 단위는 Stream이라고 하는데, Stream은 말 그대로 연속적으로 이어진 크기를 알 수 없는 데이터이다. 이 Stream을 socket에 write하며, Stream은 보통 1500 byte인 MTU, 1460 byte인 MSS(Maximum Segment Size)에 비해 크므로, MSS에 맞게 Stream을 잘라내어 송신한다.
2. TCP/IP 송수신구조
Buffer
위에서 언급했듯이 프로세스에서 다루는 파일의 용량 단위(예를 들어 1.4MB)와 패킷의 단위(약 1.5 kB)에는 큰 차이가 있다. 이런 크기의 차이, 그리고 네트워크 지연 등에 의해 발생하는 문제를 최소화하기 위해 Buffer가 존재한다. Buffer는 Application 자체(아래 그림에서는 Server, 서버 개발자가 buffer 크기를 정의함), Socket 모두에 존재하며 Stream을 자른 Block을 Buffer로 Copy후 Kernel mode로 전송한다. Kernel mode로 전송하는 그 순간에 Segment 단위로 자른다(Segmentation).
Buffer와 window
그리고 여러 패킷을 모아서 Frame 단위로 합쳐진 뒤 다른 네트워크로 넘어간다. 다만 라우팅 과정에서 패킷을 감싸고 있는 Frame은 수시로 바뀔 수 있다. 수신측에 도착한 패킷의 원본 데이터가 수신측의 Socket의 Buffer에 전달된다. 연속적으로 도착하는 데이터들은 Socket의 Buffer에 쌓이고, 동시에 Application 레벨의 Buffer로 전달된다. Application의 Buffer는 데이터를 받아들여야하므로 자신의 Buffer를 지속적으로 비운다. 이 과정에서 Socket의 Buffer와 Application의 Buffer간 속도차이가 발생한다. 여기서 Buffer에 남은 여유 공간을 window라고 부른다.
TCP ACK와 장애
수신 측에서 데이터를 순차적으로 받으면서, 현재 어떤 데이터를 받았고 얼마만큼의 window가 존재하는 지를 송신 측에 알리기 위해서 ACK(Acknowledgement) 메시지를 보낸다. 이 ACK는 몇 번째 패킷을 받았는지에 대한 숫자값(ex. ACK #3)과 여유공간에 대한 정보가 포함된다. 이후 송신 측에서 이 메시지를 받고나면 다시 수신 측으로 데이터를 보내는(ACK #3을 받았으니, 4번 데이터를 보냄) 연결 방식으로 작동한다.
이 과정에서 발생할 수 있는 다양한 장애들이 있다.
- Loss : 데이터가 유실되어 발생하는 장애
- ACK Duplication: 수신 측에서 송신 측으로 ACK를 정상적으로 보내지 않으면, 송신 측에서 Retransmission을 통해 데이터를 다시 보낸다. 그런데 모종의 사유로 타이밍이 맞지 않아서 수신 측에서 ACK #3을 보낼려는데 송신 측의 Retransmission에 의해 ACK #1, #2가 다시 한번 수신 측에 도착하고, 수신 측은 다시 또 ACK #3을 보내어 ACK가 중복되는 현상이다.
- Out of order: 순서를 가져야하는 TCP 데이터가 순서대로 오지 않고 순서를 건너뛰어서 도착한다거나, 순서가 바뀌어 오는 경우를 말한다. -> 이 경우는 심각하지 않다면 OS단에서 어느 정도 보정을 한다.
- Zero window: 네트워크가 안정적으로 Buffer를 채웠는데 Application이 Buffer를 빨리 비워주지 못해서 여유공간이 없는 경우이다. Process가 비워내는 속도가 네트워크의 수신 속도보다 느린 경우 발생한다.
1,3 에 의한 에러는 거의 네트워크상에서의 에러이고, 2의 에러는 Endpoint, Application에서 발생했을 확률이 높다. 4는 Application에서 문제가 있는 것이다.
3. IP 주소
IP(IPv4) 형식
IPv4의 Header 및 Data 형식은 아래 그림처럼 되어있다. Header가 보통 20 byte인데, Option이 붙는 경우 40 byte만큼이 Header에 추가될 수 있다. Data 부분이 Payload에 담기는데, 65515 bytes까지 담길 수 있지만 보통은 MTU인 1500 bytes에서 Header를 제외한만큼(보통의 경우 1500 -20 = 1480 bytes)만 담긴다.
- Version: IP의 버전을 나타낸다. IPv4인 경우 값이 4이다.
- IHL(Internet Header Length): 보통 5이다. (32 bit(4 byte) * 5) = 20 byte가 되는 것이다.
- TOS(Type of Service): 서비스의 처리량, 지연율 등을 나타내는 flag라고 한다. ref)http://www.ktword.co.kr/test/view/view.php?m_temp1=2051
- 2행의 Identification, Flags, Fragment offset은 단편화와 관련된다. MTU가 1500이 보통인데, 어떤 패킷은 1300 byte로만 받게 되어있다면 이 패킷을 잘라야된다. 그와 관련된 정보가 담긴다.
- TTL(Time to Live): 패킷의 수명. Hop할때마다 줄어들다가 0이 되면 폐기된다. 자세한 내용은 뒤에서 다룬다.
- Protocol: Payload 내부에 다른 Header가 encapsulation 될텐데, 그 내부의 header를 어떤 규칙으로 해석해야할지를 표시한다.
- Header checksum: 송수신 과정에서 에러가 발생하여 손상이 일어나지 않았는지 검사하는 요소이다.
Subnet Mask와 CIDR(Classless Inter-Domain Routing)
기본적인 개념이고 다른 곳에서도 많이 알 수 있는 내용이라 핵심만 간단하게 정리한다.
기존에는 192.168.0.10이라는 IP 주소와, 255.255.255.0으로 표현되는 서브넷마스크 주소를 AND 연산하여 IP 주소를 표현했다. 그리고 서브넷 마스크의 종류에 따라 A, B, C Class 등으로 나눴다.
CIDR은 192.168.0.10/24로 보다 간단하게 표현한다. 이렇게 해서 앞에서부터 총 24비트까지가 Network ID이고, 나머지 8비트는 Host ID임을 표현한다. 이럴 경우 AND 연산을 하지 않고 /24만큼 잘라서 원하는 네트워크 주소가 같은지(==)만 비교한다.
서브네팅: 기본적인 A, B, C class로 잘린 IP 주소를 서브넷 마스크를 늘려서 더 자르는 것이다. 예를 들어 255.255.255.0으로 자르면 C class가 되는데, 여기서 Network ID에 2bit를 더 할당하고 싶다면 서브넷 마스크 주소를 255.255.255.192로 해서 맨 끝의 0의 8비트 중 맨 앞 자리 2개를 1로 만들어주면된다(0000 0000 -> 1100 0000). 그럼 네트워크 ID는 26 bit, 호스트 ID는 6bit가 된다.
4. IP 주소 관련 용어
Broadcast
IP 주소에서 네트워크 주소 외 호스트 주소까지 모두 255(1111 1111)로 되어있는 주소는 broadcast 주소로 사용된다.
패킷을 보낼 때, 목적지 IP 주소의 호스트 주소를 255로 입력하면 위 그림처럼 네트워크 내부의 모든 호스트에 요청을 보내게 된다. 개념 자체는 앞 글에서 기술했던 내용과 같다. IP 주소와 그림을 통해 복습해봤다.
https://whitepro.tistory.com/924
Localhost(Loopback Address)
127.0.0.1로 표현되는 주소이다. Host 자신을 가리키는 IP 주소다. 이 방식은 결국 내 컴퓨터의 또 다른 Process를 호출하는 방식으로 작동한다.
본인의 host ip 주소로 쏘는 방식은 그 주소가 변경될 수도 있기 때문에 127.0.0.1이라는 주소로 설정하는 경우 루프백으로 통신한다는 규칙이 있는 것이다. 참고로 주소의 맨 끝자리가 1일 필요는 없으나 보통 1로 많이 쓴다.
TTL과 단편화
인터넷은 라우터의 집합체라고 할 수 있는 논리 네트워크이다. 라우터 간의 통신을 통해서 패킷을 전달하는 구조이다. 그런데 만약 목적지를 찾는데 실패한 패킷이 있다면, 그 패킷이 네트워크를 계속해서 돌아다니게하여 네트워크에 부담을 주게하면 안된다. 그래서 적용한 개념이 TTL(Time To Live)이다. TTL은 Router에서 다른 Router로 넘어갈 때(Hop) 1씩 감소한다. 보통 128, 255 값을 사용한다. 계속 감소하다가 0 값이 되면 해당 패킷은 폐기되는 것이다.
단편화는 MTU의 차이로 발생한다. 보통 1500 byte가 일반적인데, 만약 MTU가 1400인 라우터가 있다면 송신 측에서 패킷을 조각내서 보낸다. 이것을 단편화라고 한다.
위 그림처럼 잘린 패킷은 각 헤더에 offset등의 값이 추가된다. 그 단편화 값들을 기반으로 수신 측 endpoint에서 조립을 한다. 중간에 거치는 다른 라우터에서 조립하지 않고 수신측 Server에서 조립한다는 것을 기억하자.
참고로 대부분 MTU는 1500인데, 주로 VPN(Virtual Private Network)에서 IPSec에 의한 터널링이 발생하면 MTU가 1400 등으로 줄어들어서 단편화가 발생한다. 대부분의 경우 단편화가 발생하지 않도록 패킷 용량 자체를 낮춰서 통신한다.
DHCP(Dynamic Host Configuration Protocol)
윈도우에서 네트워크 설정에 들어가보면 아래 그림같은 화면이 뜬다. 여기서 나를 구분하기 위한 식별자로 Host 주소로서 IP 주소를 설정하는 것인데, 이 IP 주소를 ISP(Internet Service Provider)가 공급해주는 서버로 설정한다. 그런데 이 설정에 필요한 것이 IP주소, Subnet Mask, Gateway IP, DNS서버 주소까지 모두 설정해야한다. 그러나 직접 하는 것은 쉽지 않으므로 보통의 경우 자동 설정을 이용한다. 참고로 8.8.8.8은 구글의 DNS 주소이다.
DHCP는 서버와 클라이언트로 구성되어, 위 언급한 모든 IP 주소 관련 설정 정보를 서버에서 갖고 있다. 그래서 클라이언트에서 DHCP 서버에 요청을 하면 설정 정보를 알려주어 자동으로 설정이 되는 방식이다.
PC가 켜지면 소속된 네트워크쪽으로 Broadcast로 DHCP 서버를 확인하는 요청이 날라간다. 그럼 DHCP 서버에서는 네트워크상에 할당되지 않은 IP 주소를 새로 켜진 PC에 할당하게 된다. 좀 더 깊은 내용은 DHCP 프로토콜 자체에 대해서 공부해야한다.
ARP(Address Resolution Protocol)
IP 주소를 통해 MAC 주소를 알아낼려고 할 때 사용된다. PC를 켜면 Gateway의 MAC 주소를 알기 위해서 ARP 요청을 쏜다. 이후 ARP의 응답에서 Gateway의 MAC 주소를 알아낸 뒤에 모든 요청들을 Gateway쪽으로 보내는 방식으로 작동한다. ARP 요청도 DHCP와 비슷하게 Broadcast 요청을 날려서 Gateway의 주소를 알아낸다.
어떤 다른 주소(예를 들어 네이버)로 요청을 보낼 때, header상에 Source는 host의 ip주소로 설정하지만, Destination 부분은 네이버의 주소가 아니라 Gateway의 MAC주소로 설정한다. 그러고나서 Gateway에서 다시 Destination을 DNS 서버에서 알아낸 네이버의 주소로 설정하여 요청을 보내는 방식이다.
참고로 터미널에 arp -a라고 명령어를 입력하면 Gateway 주소가 캐싱되어있다.
Ping, RTT
ping은 특정 호스트에 대한 RTT(Rount Trip Time)을 측정하는 프로그램 이름이다. Dos(Denial of Service) 공격용으로 악용되기도 한다.
참조
인프런: 외워서 끝내는 네트워크 핵심이론-기초, 널널한 개발자
'Computer Science > Network' 카테고리의 다른 글
네트워크 이론 기초 - 4. L4 Layer - TCP, UDP (0) | 2024.03.17 |
---|---|
네트워크 이론 기초 -2. L2 Layer - NIC, Access, Distribution Switch, LAN/WAN (0) | 2024.02.20 |
네트워크 이론 기초 -1. OSI 7Layer, Host, 스위치, 메트릭 (0) | 2024.02.19 |