1. IPv4 주소의 구조
- MAC 주소는 L2 레벨에서 사용되는 48 bit 주소다.
- IPv4 주소는 L3 레벨에서 사용되는 32 bit 주소다.
- 그런데 이 32비트를 8비트씩 쪼개서 표현한다.
- 8비트는 2^8이고, 십진수로 표현하면 0 ~ 255다.
- 그리고 이 주소는 24비트의 네트워크 ID와 8비트의 호스트 ID로 나뉜다.
- 이처럼 두 개 ID로 나눔으로써, 인터넷에서 큰 범위(네트워크)의 구분과 작은 범위(호스트)의 구분이 가능하다.
2. L3 Packet
- Packet은 L3의 데이터 단위이기 때문에 L3, IP와 필수적으로 연관된다.
- Packet은 Header와 Payload로 나뉜다.
- Header는 주소 등이 담긴 메타 정보
- Payload는 실질적인 데이터
- Packet의 최대 크기는 MTU(Maximum Transmission Unit)으로 부르며, 약 1500 bytes이다.
3. Encapsulation
- Packet에 관해 논할 때 캡슐화를 함께해야 한다.
- 캡슐화는 객체지향에서 구현을 숨길 때 주로 사용하는 개념이다.
- 그런데 여기에서는 조금 다른 것 같다.
- 가장 바깥의 데이터는 L2의 Frame이다.
- L2 Frame의 Payload에는 L3의 Packet이 들어 있다.
- L3 Packet의 Payload에는 L4의 TCP segment가 들어 있다.
- 그리고 L4부터는 여기서부터는 이러한 캡슐화가 멈추고, 다른 형식으로 L5부터의 정보를 포함한다.
- 이처럼 캡슐화되어 있는 데이터를 한 단계씩 까서 정보를 확인하는 것을 Decapsulation이라고 한다.
4. Packet의 생성과 전달, 소멸
- Packet의 헤더에는 출발지와 목적지, 그리고 보내고 받는 사람에 대한 정보가 적혀 있다.
- 여기서 보내고 받는 사람은 각각 프로세스에 해당한다.
- 프로세스는 데이터를 Packet으로 만들고, Gateway에 보낸다.
- Gateway는 수신 host 주소를 참고해서 Packet을 전달하고, host 중에서도 일치하는 Port 번호에 전달한다.
- 그림의 노란 원 부분은 "Socket"이다.
- Socket은 애플리케이션 레벨에서 커널 모드의 TCP/IP 프로토콜에 접근하기 위한 인터페이스다.
- 프로세스가 데이터를 써서 Socket을 통해 커널로 넘어간다.
- 커널에서는 데이터에 TCP 헤더를 붙여서 한 덩어리의 segment를 만든다.
- segment에는 IP 헤더가 붙어서 한 덩어리의 Packet이 만들어진다.
- Packet에는 Ethernet 헤더가 붙어서 한 덩어리의 Frame이 만들어진다.
- 결국 인터넷으로 나가는 데이터는 Frame 형태가 된다.
5. 계층별 데이터 단위
- L1 ~ L2 : Frame
- L3(IP) : Packet
- L4(TCP) : Segment
- L5 ~ L7(Socket) : Stream
- Packet의 최대 크기는 MTU로, 1500바이트 정도 크기다.
- Segment의 최대 크기는 MSS로, 1460바이트 정도 크기다.
- 그런데 Stream은 프로세스가 보내려고 하는 데이터 크기이므로, MTU나 MSS의 크기를 훌쩍 넘을 수 있다.
- 따라서 Stream을 여러 조각으로 쪼갠 후 여러 개의 Segment로 보내는 것이다.
6. TCP/IP 송수신 구조
- 바로 위에서 언급했던 것처럼, Stream의 크기가 MTU, MSS보다 클 경우 발생하는 송수신에 대해서 설명하게 될 것이다.
- 예를 들어, 서버에서 클라이언트로 1.4MB의 파일을 전송할 때 데이터는 어떻게 전달될까?
- 서버 프로세스와 Socket은 각각 버퍼를 갖추고 있다.
- 1.4MB의 파일의 일부가 복사되어 프로세스의 버퍼에 담기고, 이 버퍼가 Socket의 Buffer에 복사된다.
- 이 때, Socket은 I/O에 대해 'write'를 받고 버퍼를 채우게 되는 것이다.
- 그리고 이 버퍼를 채우는 데이터를 "Stream"이라고 부르게 된다.
- Stream은 TCP를 만나면 Segmentation이 발생하면서 Stream 일부를 하나의 Segment로 쪼개진다.
- 그리고 각각의 Segment는 번호를 부여받는다.
- IP에서 Segment 하나는 Packet으로 싼다. (Encapsulation)
- 그리고 Packet은 다시 Frame으로 싸서 Gateway를 통해 인터넷으로 나가는 것이다.
- 참고로, TCP는 connection-oriented이기 때문에 연결이 확정짓고 데이터를 전송한다.
- 라우팅을 통해 클라이언트의 L2에 도착한 Frame은 조립의 역순으로 Packet -> Segment로 해체(Decapsulation)된다.
- Segment는 Socket의 버퍼에 채워진다.
- 그리고 클라이언트의 TCP 측에서 "ACK #2"를 보내게 되는데, 1번 segment까지 잘 받았다고 서버의 TCP에 확인시켜주는 것이다.
- 서버 측에서도 이를 확인하기 위해 일정 segment까지 보낸 후에는 "ACK"를 기다린다.
- 또한, "ACK"에 클라이언트 Socket의 빈 공간의 크기(Window Size)도 함께 보내기 때문에 서버 측에서도 기다려야 하는 것이다.
네트워크 송수신 장애 케이스
1) Loss
- 서버에서 클라이언트로 보낸 Frame이 라우팅 중에 소실되었을 때
2) Re-trans (ACK Duplicate)
- 위에서 언급했듯, 서버는 "ACK"를 받았을 때 다음 segment를 보내줄 수 있다.
- 그런데 일정 시간 이상 클라이언트 측의 "ACK"를 받지 못하면, Loss가 일어난 줄 알고 동일 segment를 다시 보낸다.
- 이 때 사실 클라이언트가 정상적으로 받고 보낸 "ACK"가 오는 와중이었다면, 다시 받아서 다시 "ACK"를 날린다.
- 즉, "ACK"가 중복되어 서버에 도착하게 된다.
3) Out of Order
- segment가 순서대로 도착해야 하는데 클라이언트가 뒤죽박죽 받았을 때
4) Zero Window
- 클라이언트 프로세스가 Socket 버퍼를 비워주는 속도보다 Socket이 버퍼를 채우는 속도가 빠를 때
- 그러면 Socket은 지속적으로 외부에서 들어오는 segment를 버퍼에 담지 못하게 된다.
7. IPv4 헤더 형식
- 기본적인 헤더의 크기는 20바이트다.
- 그러면 MTU가 1500바이트니까, 페이로드는 1480바이트가 될 것이다.
- 위에서부터 살펴보자.
- Version은 IPv4의 'v4'에 해당한다.
- 그러니까 값이 4가 된다.
- IHL(Internet Header Length)는 보통 5인데, 위의 Destination address까지 5행인 것과 일치한다.
- TOS는 Type of Service의 약자이다.
- Total Length는 말그대로 전체 Packet의 크기다.
- 2^16비트로 표현 가능하기 때문에 Packet이 2^16바이트의 크기를 가질수도 있는 것이다.
- 두번째 층은 Fragmentation(단편화)과 관련된다.
- Identification은 fragment끼리 붙이기 위한 식별자로 사용된다.
- Flags는 단편화가 가능한지 여부와 단편화가 이미 된 상태인지 여부를 표현한다.
- Fragment offset은 fragment의 시작 위치를 나타낸다.
- TTL은 Time-to-Live의 약자다.
- 즉, Packet의 유통 과정에서 언제까지 살아남을 것인지 결정해준다.
- 즉, TTL의 값이 0이 되면 Packet은 소멸한다.
- Protocol은 IP Packet 페이로드 내에 있는 TCP의 프로토콜을 가리킨다.
8. 서브넷 마스크와 CIDR
- 서브넷 마스크는 두번째 줄의 1111 1111 * 6 + 0000 0000의 값을 가진다.
- 서브넷 마스크는 IP 주소와 비트 단위의 AND 연산을 통해 네트워크 주소만 걸러내는 역할을 한다.
- 그래서 첫 8비트, 16비트, 24비트를 네트워크 주소로 잡느냐에 따라 A, B, C 클래스로 나누기도 했다.
- 그러나 지금은 다른 방식을 활용한다.
- 그래서 나온 것이 CIDR(Classless Inter-Domain Routing)이다.
- CIDR은 IP 주소를 24비트(16과 같은 다른 비트값도 가능)로 나눠서 네트워크 주소를 걸러낸다.
- 그래서 위 192.168.0.10을 24로 나누면, 192.168.0.0 ~ 192.168.0.255의 IP 주소 값을 네트워크 아이디 범위로 할 수 있는 것이다.
- 그리고 이 범위를 라우터에서 라우팅하는 데에 사용하게 된다.
9. Broadcast IP 주소
- MAC 주소에서 Broadcast 주소는 48 비트 체계니까 "FF-FF-FF-FF-FF-FF"였다.
- Broadcast IP 주소에서는 호스트 ID를 255로 가진다.
- 그리고 이는 2진수로 나타내면 "1111 1111"이 된다.
- 따라서 192.168.0을 네트워크 ID로 가지는 모든 주소에 전송되는 것이다.
- 참고로, 호스트 주소인 0 ~ 255 중에서 0과 1, 255는 사용할 수 없다.
- 0은 서브넷 마스크가 "0000 0000"이기 때문에 불가능하다.
- 1은 Gateway가 보통 가져가기 때문에 불가능하다.
- 255는 Broadcast IP 주소이기 때문에 불가능하다.
10. 호스트 자신을 가리키는 IP 주소
- 기본적인 IP 주소는 상대방에게 접근하기 위해 가지고 있는 주소다.
- 그러나 인터넷 상에서 자기 자신에게 접속하기 위한 주소가 필요한데, 이것이 "127.0.0.1"이다.
- 이 주소를 "Loopback Address"라고 한다.
- 인터넷 연결은 컴퓨터가 하는 것이 아니라, 프로세스가 하는 것이기 때문에 내 프로세스끼리 통신하기 위해 필요하다.
- 위처럼 나의 클라이언트 프로세스와 서버 프로세스끼리 통신하기 위해 필요한 것이다.
- 이를 "IPC"(Inter process Communication)이라고 한다.
- 이 때 IP 주소를 자신의 고유한 주소로 사용할 수도 있다.
- 그러나 Loopback 주소는 원래 IP 주소에 독립적이라는 장점이 있기 때문에 많이 사용한다.
11. TTL과 단편화
- 강의에서 "인터넷은 쉽게 말하면 라우터와 DNS의 논리적인 집합체다"라고 한다.
- 여기서 라우터는, 인터넷에서 정보가 이동하기 위해 거치는 중간 지점이다.
- 그리고 TTL(Time To Live)은 수명의 역할을 한다.
- TTL은 패킷이 인터넷 상에서 전송에 실패했을 때, 좀비가 되어서 네트워크 리소스를 잡아먹는 것을 방지하기 위해 필요하다.
- TTL의 값은 라우터에서 라우터로 넘어갈(HOP) 때 줄어든다.
- 만약 TTL이 0이 되면 라우터가 이 패킷을 폐기해준다.
- 단편화는 MTU 간의 크기 차이로 발생한다.
- 송신(클라이언트) MTU는 1500 바이트, 수신(서버) MTU는 1400 바이트라면 송신 쪽에서 MTU를 쪼개줘야 한다.
- 심지어 수신 MTU가 1500 바이트로 맞춰졌다고 하더라도, 중간 라우터의 MTU가 이보다 작다면 단편화가 불가피하다.
- 만약 위처럼 5번 라우터에서 MTU 크기가 부족하다면,
- 3번 라우터에서 단편화가 발생하여 하나의 패킷을 두 개로 쪼갠다.
- 이 때 쪼개진 패킷에 IP 헤더를 붙여준다.
- 그리고 이를 수신하는 서버 측에서 두 개 패킷을 IP 레벨에서 하나로 합쳐준다.
- 그리고 합쳐진 패킷에서 세그먼트를 끌어내고, 소켓을 거쳐 프로세스의 버퍼로 옮겨진다.
- 참고로, MTU의 크기는 대부분 1500 바이트이기 때문에 단편화는 자주 발생하지 않는 현상이다.
- 그러나 VPN의 경우에는 이러한 단편화가 발생할 수 있다.
12. 인터넷 설정 자동화를 위한 DHCP
인터넷 사용 전에 해야 할 설정
- IP 주소
- 서브넷 마스크
- Gateway IP 주소
- DNS 주소
- 이 네 가지 요소를 모두 갖췄을 때 인터넷에 접근할 수 있다.
- DNS는 "www.google.com"과 같은 도메인 주소를 IP 주소로 매핑해주는 역할을 한다.
- 그리고 우리는 보통 IP 주소든 DNS 주소든 자동으로 설정해둔다.
- 이 때 이러한 자동 설정을 위해 DHCP의 도움을 필요로 한다.
- DHCP(Dynamic Host Configuration Protocol) 체계는 주소를 할당하는 서버와 할당받으려는 클라이언트로 구성된다.
- 여기서 서버가 자동으로 설정하여 클라이언트에게 할당하는 방식이다.
- 그러면 클라이언트는 어떻게 요청할까?
- PC(클라이언트)의 전원이 켜질 때 네트워크로 Broadcast 패킷을 뿌린다.
- 이 패킷은 DHCP 서버를 찾고, 서버는 응답하여 최근에 쓰던 IP 주소를 계속해서 쓰도록 확인하거나 새 주소를 할당해준다.
13. ARP
- ARP는 Address Resolution Protocol의 약자이다.
- 여기서 Address는 MAC 주소 + IP 주소를 뜻한다.
- ARP는 상대방의 IP 주소로부터 MAC 주소를 알아내기 위해 사용한다.
- 보통은 PC를 부팅할 때 Gateway의 MAC 주소를 알아내기 위해 Broadcast 통신으로서 발생한다.
- 참고로 반대로 네이버나 아마존에 접속할 때에는 L3 레벨이기 때문에 MAC 주소가 필요하지 않다.
- 따라서, 패킷 헤더는 클라이언트와 네이버 서버의 IP 주소로 채워질 것이다.
- 다만, 패킷을 감싼 Ethernet 프레임 헤더의 MAC 주소는 다르다.
- MAC 주소의 src는 클라이언트의 MAC 주소가 맞는데, dst는 Gateway의 MAC 주소가 된다.
- 참고로, PC가 Gateway의 MAC 주소를 한 번 알아내면 부팅 때마다 ARP 요청을 보내지는 않는다.
- 대신에 이 정보를 캐싱한다.
- 터미널에 "arp -a"를 입력해서 이와 관련한 정보를 확인할 수 있다.
14. Ping과 RTT
- "Ping 유틸리티"라는 프로그램은 ICMP(Internet Control Messaging Protocol)를 이용해서 RTT(Round Trip Time)을 측정할 목적으로 사용된다.
- 예를 들어, 게임에서 사용자 A가 10ms, 사용자 B가 50ms를 기록중이라면 사용자 B에 맞춘 동기화가 필요하므로 RTT를 측정해야 한다.
- 그래서 Ping은 상대방 IP 주소로 접근하여 일정 길이 문자열로 echo 요청을 날리고, 다시 받기까지의 시간을 측정하는 프로그램이다.
'네트워크 (인프런)' 카테고리의 다른 글
L5 LEVEL (0) | 2023.09.25 |
---|---|
L4 LEVEL (0) | 2023.09.20 |
L2 LEVEL (0) | 2023.09.12 |
Internet 기반 네트워크 입문 (0) | 2023.09.09 |