IP Datagram
- 헤더 길이: 20~60
- VER: version. IPv4, IPv6버전임. 4 or 6
- HLEN: 헤더 길이. 20 사용하려면 20/4=5 쓰고 60 사용하려면 60/4=15 쓴다.
- Service type: 잘 안 쓰임. 이름과 위치만 기억하기
- Total length: 헤더를 포함한 데이터그램의 총 길이
- Identification: fragmentation 재조합용. 얘를 보고 같은 애들끼리 다시 조합할 수 있음
- Flags:
- Fragmentation offset: flags 때문에 3비트 덜쓰니까 23만큼 더 쓰기 위해 /8해서 보내고 받을 땐 *8 함.
- Time to Live (TTL): 소멸 시간. Maximum Hop Count. 라우터들이 패킷을 받을 때마다 값을 하나씩 빼다가 0이 되면 더이상 전달하지 않음
- Protocol: IP헤더 안에다 ‘IP헤더를 달고 가는 상위 프로토콜이 뭔지’ 써야 받는쪽이 거기로 맞게 올림
Fragment
- 데이터그램은 다른 네트워크를 통해 이동할 수 있다. 각 라우터는 수신한 프레임에서 IP 데이터그램을 receive하고 process한 다음 다른 프레임에 캡슐화한다. 수신된/전송된 프레임의 형식과 크기는 프레임이 방금 이동한 physical 네트워크에서 사용하는 프로토콜에 따라 다르다.
- MTU(최대 전송 단위)
- 프레임에 캡슐화될 수 있는 데이터의 최대 길이 - physical network마다 다르다.
- Flags field
- D: Do not fragment 보내는쪽이 ‘분할하지 말라’고 써서 보내는 것. 분할해야 하는 상황인데 D로 돼있어서 분할전송 못하면 걍 버림
- M: More fragments. M bit value가 0이면 뒤에 더 없다는 뜻. 1이면 뒤에 더 있다는 뜻
Options
- 최대 40byte까지 가능
- Copy: 패킷들이 MTU가 작은 네트워크로 가면 패킷을 분할해야 하는데, 옵션에 있는 부분들을 어떻게 분할할지 결정함.
- 0: H|O|D -> H|O|D1, H|D2, H|D3 (첫 번째 패킷만 옵션을 가져감)
- 1: H|O|D -> H|0|D1, H|O|D2, H|O|D3 (모든 fragment가 옵션을 가져감)
- Class: 00과 10 두 개 있음. Datgram control/Debugging
- Number: 옵션들.
1) Record-route option
- 어느 라우터들을 거쳐왔는지. (라우터의 오른쪽 주소. 추적하는거니까.)
- 해당 포인터가 가리키는 빈 공간에 자기 주소를 쓴다. 그리고 다음 라우터에 패킷을 보낼 때 다음번에 쓸 빈공간을 포인터로 가리키게끔 증가시킨다.
- 7: 옵션종류, 15: 전체길이 (3+4*3)
- 누가 어디로 보내는지 정보는 기본헤더에 있음
2) Strict-source-route option
- 네트워크 관리할 때 쓰는 옵션.
- sender가, 거쳐갈 라우터 순서를 미리 정해놓은 것
- 기본헤더의 Destination이 계속 바뀜
- 아래 세줄엔 자신을 제외한 나머지를 씀
- 보내야 할 next가 나랑 연결되어있지 않은 네트워크이거나 경로가 없으면 버린다.
- 라우터의 왼쪽주소. 다음에 갈 곳이니까.
3) Loose-source-route option
- strict는 반드시 그 순서대로만 가야 되는데, loose는 그 사이에 다른 경로를 거쳐가도 된다. 좀더 flexible.
4) Time-stamp option
- 옵션에 따라 라우터들이 패킷을 전달할 때 자신의 IP주소와 시간을 적음.
5) No operation
6) End of option
Checksum
- 에러 유무 감지. 받는 쪽에서 계산한 결과가 0이면 정상
- IP의 checksum은 header만 다룬다. (data는 X)
- payload에 에러 생기면 IP checksum은 감지 못하고 TCP 헤더의 checksum에 의해 감지된다.
Reassembly table
- reassemble은 최종 목적지에서만 한다.
- 분할된 패킷들이 원래 순서대로 들어온다고 보장 못함.
- timeout: 패킷 기다려도 안 오면 재조합 불가능 -> 다 버림
- id가 같은 패킷끼리 묶는다.
- offset으로 순서를 정해 연결리스트로 관리함
- 1) MSS(maximum segment size)가 작아서 fragmentation이 안 되는 경우
: 자잘한 걸로 여러개 보냄 (분할 안 된 상태) -> 하나하나가 TCP를 올리기 때문에 중간에 작은거 하나 없어져도 나머지 작은거 3개를 받고 금방 detect이 가능함
- 2) TCP가 MSS를 크게 잡아서 segment를 크게 만든 경우
: MTU 크기를 초과해서 fragmentation을 해야 함 -> 잘게 쪼갰음
그런데 쪼갠 것 중에 하나라도 사라지면 나머지 받은 것들도 다 소용없음. TCP 긴거 자체를 못받게 됨
-> #51, 52, 53까지 전부 받고 나서야 #50이 사라진 걸 알 수 있음
- 크게 보내는 게 좋아보일 수 있으나, 분할된 패킷이 하나라도 사라질 경우 감지 오래 걸리고, 전부 다시 보내야 한다.
* MSS: 어플리케이션 계층에서 한번에 최대로 보낼 수 있는 payload 사이즈
MTU: 네트워크 계층에서 한번에 최대로 보낼 수 있는 payload 사이즈
'네트워크 > 컴퓨터네트워크' 카테고리의 다른 글
Unicast Routing Protocols (0) | 2021.06.28 |
---|---|
ICMP (Internet Control Message Protocol) (0) | 2021.06.28 |
Web and HTTP (0) | 2021.06.28 |
Delivery and Forwarding of IP Packets (0) | 2021.06.28 |
NAT (Network Address Translation) (0) | 2021.06.28 |
댓글