IPv4주소의 구조
IP
- IPv4 라고 하고 32bit(8bit * 4) 주소 체계를 가짐
- 8bit 단위로 4번 쪼개짐
- Network ID : 8 * 3 bit를 가지는 부분
- 물류센터와 비슷한 개념
- Network ID를 통해 router에서 경로를 결정지어준다
- Host ID : 마지막 8bit를 가지는 부분
L3 Packet
Packet
- 단위 데이터
- L3 IP Packet 이라고 알아두자
- Header(송장 번호), Payload(택배 내용물)로 나뉘어지고 상대적인 분류임.
- 최대 크기는 MTU(Maximum Transmission Unit)라 한다.
- header+Payload 를 말하는 것이고 1500bytes 정도
EnCapsulation, Decapsulation
- 가장 큰 박스가 L2 Frame
- Payload #1 에 들어있는 것이 L3 IP Packet
- L3 Payload #2 가 L4 TCP Segment.
- Frame의 Payload가 그대로 Packet이 된다.
- 계속해서 Payload가 다음 계층의 데이터 단위가 되지만,
- L4를 넘어가면 데이터 단위가 Stream이 되면서 형태가 달라짐
- 단위화하면서 기존 정보가 직관적으로 보이지 않게 됨
패킷의 생성, 전달, 소멸 (프로세스1 → 프로세스2)
- 호스트1의 프로세스1가 데이터 생성
- 소켓을 통해 데이터를 segment 단위로 만들어 IP에 전달
- IP에서 segment를 다시 패킷으로 만들어서 게이트웨이에 전달
- 게이트웨이가 IP를 보며 라우팅을 통해 호스트2에게 전달
- 호스트2에서 port번호를 통해 프로세스2에게 전달
계층별 데이터 단위
Layer | Unit | generaly maximun size |
---|
L1~L2 | Frame | |
L3 | Packet | MTU(1500 bytes) |
L4 | Segment | MSS(1460 bytes) |
(Not Layer) Socket | Stream | 정해진 크기 X |
- 소켓은 레이어가 아니지만 데이터 변환에 있어 중요한 역할을 가짐
- Stream이라는 단위를 가지고 정해진 크기는 없음
- Socket에선 Stream을 MSS에 맞춰 데이터를 가공
TCP/IP 송수신 구조
송신 (전체적으로 Encapsulation)
- 서버(정확히는 서버의 프로세스)에서 소켓으로 데이터를 버퍼에 Send(Copy)
- 버퍼의 데이터를 받기 위해 소켓에서 I/O(입출력)가 일어나고 이걸 위한 소켓버퍼가 존재
- 버퍼가 있다면 Bufferd IO, 없다면 NonBufferd IO
- 버퍼의 크기는 개발자가 정함
- 소켓에선 버퍼의 크기만큼 데이터를 복사해서 받아옴
- 아직 데이터가 분해된 것이 아닌 일부분을 올려놓았을 뿐
- 이 올려진 데이터가 Stream
- 소켓에서 L4에 보내기 위해 Stream을 Segmentation
- TCP는 소켓에게서 받은 Segment 데이터를 L3로 전송
- IP에서 Segment에 header정보를 붙여 Packet으로 만들어 L2로 전송
- L2에서 Packet을 Frame으로 포장하여 L1 이후로 전송
- 여러 스위치를 거쳐 목적지의 host까지 도착
수신 (전체적으로 Decapsulation)
- L1~L2로 Frame데이터를 받아서 프레임을 풀어서 L3로 전달 (Frame 소멸)
- L3에서 패킷을 분해하여 Segment를 L4로 전달
- L4에서 포트번호를 확인하여 segment 데이터를 해당 프로세스의 소켓으로 전송
- 이후 프로세스 버퍼에서 소켓 버퍼를 Receive(Read) 하려할 때 버퍼 크기만큼 읽어오려 함
- 이 때 프로세스 버퍼와 소켓 버퍼의 속도 차가 발생 (한 쪽은 채우고 한 쪽은 퍼내는 상황)
- L4(TCP)에서는 데이터를 받으면 잘 받았다고 FeedBack(ACK, Acknowledgment)을 전송.
ACK에 포함된 여러 정보 중 여유 공간에 대한 정보가 포함되어 있음
- 송신측에서 ACK를 받으면 여유 공간을 보고 공간이 있다면 다음 패킷을 전송
- c~d 과정이 반복되면서 패킷들을 받음.
- 프로세스에서 데이터를 수신
네트워크 장애
- Loss
- 데이터 유실. 원인은 매우 다양(어디서든 일어날 수 있다)
- Re-transmission
- 1번 데이터에 대한 ACK를 받기 전에 다시 1번 데이터를 보냄
- ACK를 2번 이상씩 보내버리는 상황 발생
- Out of order
- 1→2→[] → 4 처럼 중간에 순서가 빠지는 상황
- Zero window
- 버퍼의 여유공간(window Size)이 없는 상황
- End-point의 App 버퍼가 제 때 받지 못한 상황
IPv4 Header
- Header은 옵션이 따로 붙지 않는다면 20 bytes 정도
- Data는 65515(65535 - 20)까지 커질 수 있지만 기본적으로 MTU(1480)을 따름
- Version [1행, 4bit] : 버전 IP 버전 정보
- IHL(Internet Header Length) [1행, 4bit] : 헤더의 길이. 보통 5정도 (5행 * 4 = 20bytes)
- TOS (Type Of Service)
- Total length : 전체 길이. 보통 16bit(2^16 = 65536)
- Fragment offset : Identification, Flags도 포함하여 2행은 단편화와 관련되어 있음
- 단편화 MTU 크기와 같은 이유로 패킷을 잘라야 할 때
- TTL (Time To Live) : 유통과정에서 홈을 지날때마다 감소하고 0이되면 소멸
- Protocol : IP, TCP, UDP 등 어떤 프로토콜인지 파악
- Header Checksum : 패킷의 송수신 과정에서 손상을 파악하기 위한 데이터 합 표시
- Source, Destinaton address : 출발지, 목적지의 주소
서브넷 마스크, CIDR
Subnet Mask
- Mask 연산 : 패킷의 IP에 AND연산을 해서 목적지의 네트워크가 맞는지 판단하는 연산
- 왼쪽부터 8,16,24 bit을 네트워크 주소로 가지면 순서대로 A, B, C 클래스라 불렀지만 현재는 사용X
- IP - 192.168.0.10, Mask - 255.255.255.0
- Mask를 통해 24자리 까지가 네트워크 주소인 것을 알 수 있다.
CIDR(Classless Inter-Domain Routing)
- 클래스를 제외한 형태
- IP - 192.168.0.10, Mask - 255.255.255.0 —> 192.168.0.10/24
- Subneting
- 주어진 host를 다시 쪼개서 네트워크 망을 만드는 것
- 원래 호스트 주소가 8bit 이였다면,
- 왼쪽 2bit → 네트워크 주소 / 6bit → Host 주소 ⇒ 2^6 개의 호스트를 가지는 서브넷 형성
Boardcast IP Address
Boardcast IP Address
- MAC 주소에서는 48bit 이고 1로 가득찬 주소를 가졌음
- IP - 192.168.0.255/24 ⇒ 192.168.0 의 네트워크 전체에 송신
- 따라서 8bit 호스트 주소에서 사용 가능한 주소 수는 (2^8 - 2)
- 255 - broadcast / 0 - 연산 X or 다른 용도
Host 자신을 가리키는 IP 주소
127.0.0.1
- 자기 자신을 가리키는 IP 주소. 이전의 주소들을 remote(원격) 주소
- Client Process가 TCP/IP 를 통해 접속할 때, 127.0.0.1이면 어떤 방식이든 IP층에서 다시 Server 프로세스를 가리킴
- Loopback Address라고 부름
- IPC(Inter Process Communication) 구현
TTL과 단편화
Router와 L3 Switch
- Router 가 L3에 포함, L3가 Router에 포함, 구분지을 필요가 없다 등등…
논란이 많다. 개념상 L3가 우선이긴 하지만 굳이 구분에 노력하진 말자
TTL (Time To Live)
- Packet이 목적지까지 도달하는데 실패하는 경우, 패킷은 빨리 사라져줘야 한다.
- 그렇지 않으면 네트워크 상에서 떠돌며 속도 저하의 원인이 된다.
- 그러므로 TTL을 줘서 자동 소멸이 될 수 있도록 한다.
- Hop 이라는 수가 주어지고 Router를 통과할 때 마다 1씩 줄어든다.
- 0이 되면 소멸 → 이것을 source에 알려주는 router도 있고 아닌 router도 있음
단편화
- 패킷을 다시 나누는 것
- MTU 크기 차이로 발생
- 기본적으로 1500 bytes지만 더 작은 MTU를 가지는 패킷이 있을 수 있음
- 목적지로 가는 중에 중간의 Router가 1400 MTU를 가지는 경우,
- 패킷이 분해되어 2개로 쪼갠 다음 전송
- 패킷의 조립은 최종적으로 Endpoint에서 진행됨
- Endpoint의 IP 계층에서 조립 후 Segment로
- 가장 좋은 방법은 경로 상의 MTU가 최소인 곳에 맞춰서 처음부터 하향 평준화로 진행
- MTU가 1500도 안되는 경우
- VPN - IPSec VPN 과 같은 터널링 기술이 적용되었을 때 (보안성을 대가로 MTU를 낮춤)
인터넷 설정 자동화를 위한 DHCP
인터넷 사용 전에 해야 할 설정
- IP 주소
- Subnet mask
- Gateway IP주소
- DNS 주소
DHCP (Dynamic Host Configuration Protocol)
- DHCP 체계는 주소를 할당하는 서버와 할당 받으려는 클라이언트로 구성
- 복잡한 인터넷 설정을 자동으로 해줌
- 핵심은 내가 사용할 IP주소를 서버가 알려주는 것
DHCP 적용 과정 (초간단 요약)
- 전원이 켜지면서 DHCP를 찾는 Broadcast 패킷 전송
- DHCP 서버에서 응답
- 최근에 사용한 주소를 사용하겠다는 요청 전송
- OK 또는 안될 땐 새로운 IP 할당해주면서 Gateway, DNS, Subnet mask 까지 알려줌
ARP (Address Resolution Protocol)
ARP
- ARP의 Address : IPv4 주소(L3), MAC 주소(L2)
- IP 주소로 MAC 주소를 알아내려 할 때 활용
- 보통 PC를 부팅하면 Gateway의 MAC 주소를 찾아내기 위해 ARP request 발생
- 이 request의 reply로 MAC 주소를 알 수 있음.
- Gateway의 MAC Address를 모르면 통신이 안되니까.. (물리적 연결 구간)
과정
- 네트워크 내의 PC의 ARP request가 Broadcast로 나감
- Gateway에서 reply로 MAC address를 보냄
- 이 PC의 데이터 전송 시 Frame의 목적지는 Gateway MAC 주소가 됨
- 만약 PC에서 네이버로 데이터를 송신하면
Packet의 IP 목적지는 네이버의 IP지만
MAC 목적지는 Gateway가 됨
Ping, RTT
Ping
- Ping 유틸리티(프로그램 이름)는 특정 Host에 대한 RTT(Round Trip Time)을 측정할 목적으로 사용
- ICMP(Internet C Message Protocol) 이용
- Dos(Denial of Service) 공격용으로 악용되기도 한다.
- 흔히 게임에서 동기화가 중요한 상황에서, 각자 서버로부터 받는 응답시간이 차이날 때 이용
RTT