Options
기본 header 뒤에 option이 있을 수 있다.
첫 1byte는 option의 type을 나타낸다. 다음 1byte는 option의 길이, 그 이후에 저장하는 데이터 공간으로 이루어져 있다.
6가지의 type 종류에 따라 class는 Datagram control와 Debugging and management로 나뉜다.
Copy bit는 모든 분할된 패킷에 option이 들어갈 지, 분할된 첫 번째 패킷에만 option이 들어갈 지를 결정한다.
Categories of options
option의 크기에 따라 single-byte / multiple-byte로 나눠진다.
single-byte option은 padding용으로 특별한 역할을 하지 않고,
multiple-byte option에 대해서 알아보자.
Record-route option
Record-route option은 위와 같은 구조이다.
Record-route option은 1byte의 type(record-route), length, pointer와 각각의 IP address 4byte씩을 가지고 있다.
패킷이 출발하여 다른 네트워크에 다다르면 router의 IP address를 pointer가 가리키는 곳(4byte)에 저장한다. 저장하면, pointer는 다음 주소가 들어갈 빈공간을 가리킨다.
다음 네트워크에 다다르면 또 pointer는 4byte만큼 증가하고, router의 IP가 저장된다.
최종 목적지에 도달하면, option type이 7이므로 record-route option임을 확인하고, 어떤 router를 거쳐왔는지를 확인할 수 있다.
record-route에 저장되는 router IP는 router가 나가는 쪽에 할당된 IP주소가 적힌다.
Strict-source-route option
strict-source-route option은 type이 137이다.
strict-source-route option은 패킷이 거쳐가야할 router를 미리 지정해놓는 것이다.
출발하고 Destination에 적힌 IP의 router로 이동 후 각 네트워크에서 pointer가 가리키는 IP주소의 router로 이동한다.
Destination이 가리키는 IP에 도착하여 다른 네트워크로 다다르면 pointer가 가리키면 IP를 Destination과 교체하고 pointer를 4byte 증가시킨다.
다음 네트워크로 다다르면 그 다음으로 가야할 IP를 pointer가 가리키고 있으므로 해당 IP주소와 Destination의 IP주소를 교체하여 Destination으로 이동한다.
최종 목적지에 도달하면, 패킷이 어떤 router를 거쳐왔는지 알 수 있다.
option에 적힌 IP주소로 진행하다가 table이 잘못되어 Destination의 IP와 일치하는 router가 없는 경우 패킷이 버려진다.
strict-source-route option에서는 네트워크 안에서 어떤 router로 가는지 알려주어야 하므로 router의 들어오는 쪽에 할당된 IP주소가 적힌다.
Loose-source-route option
Strict-source-route option과 비슷하나, Strict-source-route와 다르게 IP 주소들이 적혀있는 순서가 바뀌거나, 중간에 다른 경유를 거쳐오는 것이 가능하다.
Time-stamp option
router가 time-stamp option을 받게 되면, 패킷을 전달할 때 출발 시간을 적는다.
time-stamp option이 세 가지 정도 있지만, 여기서는 시간과 주소까지를 적는 option이다.
router가 패킷을 보낼 때 자신의 IP주소와 해당 시간을 적는다. 다음 router도 동일하게 동작한다.
패킷이 지나온 router 경로와 각각 걸린 시간을 알 수 있다.
위 그림에서 option의 가장 오른쪽 1은 flags bit인데 이의 사용을 알아보자.
Use of flags in timestamp
flag값에 따라 0인 경우 IP주소만, 1인 경우 IP주소와 시간, 3인 경우 IP주소가 주어지고 시간만 적는다.
example
앞에서 다룬 6개의 option중 어떤 option이 각각의 fragment에 copy되는지 알아보자.
copy된다는 것은 첫 번째 이후 fragment에 option이 copy된다는 의미이다.
각각의 option에 대해서 copy여부는 다음과 같다.
a. No operation: type is 00000001; not copied.
b. End of option: type is 00000000; not copied.
c. Record route: type is 00000111; not copied.
d. Strict source route: type is 10001001; copied.
e. Loose source route: type is 10000011; copied.
f. Timestamp: type is 01000100; not copied.
example
6개의 option 중 어떤 option이 datagram control로 사용되고, 어떤 option이 debugging managements로 사용되는가
a. No operation: type is 00000001; datagram control.
b. End of option: type is 00000000; datagram control.
c. Record route: type is 00000111; datagram control.
d. Strict source route: type is 10001001; datagram control.
e. Loose source route: type is 10000011; datagram control.
f. Timestamp: type is 01000100; debugging and management
control.
위와 같이 정의되어있다.
example
ping이라는 명령어를 통해 위와 같이 domain의 ttl을 알 수 있다.
domain을 DNS server로 보내면 대응되는 IP주소를 알려준다.
네트워크 세팅을 위해서는 최소한 IP주소, Subnet Mask, next hop router 주소, DNS 서버주소 이 네 가지가 필요하다.
-R option을 통해 record route option을 알 수 있다. 즉 해당 서버까지의 거쳐가는 IP주소들의 목록을 볼 수 있다.
traceroute는 상당히 많이 사용하는 유틸리티이다.
해당 domain까지 가는 IP주소를 알 수 있고, 또한 각각의 router까지 걸리는 RTT를 세 번 구한다.
RTT는 실시간 트래픽 양에 따라서 다르다.
Window에서는 "tracert [domain_name]" 으로 사용한다.
traceroute option으로 -g를 통해 loose source routing이 가능하다.
traceroute option으로 -G를 통해 strict source routing이 가능하다.
Checksum
checksum은 패킷으로 전송하는 데이터가 바뀌었는지를 확인하는 역할을 한다.
header의 section을 2진수로 변환하여 모두 더하고, 그것의 보수를 취하여 checksum에 넣고,
받는 쪽에서는 직접 2진수로 변환한 총합과 checksum으로 전달된 값을 비교하여 0이면 패킷이 온전히 전달된 것이다.
IP의 checksum은 TCP와는 달리 header만 체크한다.
data의 오류는 TCP에 의해서 찾고, IP는 IP header만 check한다.
example
check의 예제는 다음과 같다.
header를 각각 8byte씩 2진수로 변환하여 모두 더하고 보수를 취하여 checksum에 넣는다.
같은 방법으로 checksum으로 온 값과 계산값을 비교한다.
IP Package
위 그림은 IP에서 진행되는 것들을 표현한 것이다.
Header-adding module에서 header를 추가하고,
Processing module에서 Forwarding module로 전달하고 Forwarding module은 routing table을 참고하여 Fragmentation module로 전달하면,
Fragmentation module은 MTU table를 보고 fragmentation 간격을 정하여 분할한다.
최종 목적지의 경우 Processing module에서 Reassembly module로 들어간다.
Reassembly module에서 Fragment들을 재조합하고 상위 layer로 전달한다.
Reassemble 작업은 fragment에서 identification번호가 일치하는 것을 모아 재조합한다.
Reassembly table
재조합하는 과정을 알아보자
Datagram ID에 IP header의 identification이 들어있다.
identification이 일치하는 fragments가 linked list로 연결되어있고, 이들로 재조합을 진행한다.
만약 fragment가 전부 오지 못하면 packet loss를 대비하여 Time-out 만큼 기다리고,
Time-out만큼 기다려도 패킷이 전부 오지 않으면 fragmentation을 모두 버린다.
packet loss가 일어났을 때, 재전송을 하는 것은 TCP에서 일어나는 일이며, IP에서는 재전송이 일어나지 않고 모두 폐기한다.
IP단에서 fragmentation을 받지 못해 전체를 버리게 되면, TCP단에서 packet loss가 일어난 것이므로 이를 detect하기 위해 3-duplicated ACK이 일어날 때까지 시간이 걸린다.
TCP의 크기가 크면 IP에서 분할되는 fragmentation의 개수가 늘어난다. 수 많은 fragment 중 단 하나만을 잃어버려도 packet loss가 발생하여 시간이 걸리므로, TCP의 크기를 적당히 하는 것이 좋다.
'개발 · 컴퓨터공학' 카테고리의 다른 글
UNIX - Shared Memory, system call[shmget, shmat, shmdt, shmctl] (0) | 2021.11.29 |
---|---|
네트워크 프로그래밍 - ICMP(Error reporting messages, Query messages) (0) | 2021.11.25 |
네트워크 프로그래밍 - IP[Header, Datagrams, Fragmentation] (0) | 2021.11.23 |
UNIX - Semaphore, system call [semget, semctl, semop] (0) | 2021.11.22 |
네트워크 프로그래밍 - Web and HTTP (0) | 2021.11.19 |