2013년 11월 27일 수요일

MTU / 패킷 재조립 - 2






< 1번 패킷 >

3계층 IPv4 Header 를 살펴보면 Flags -> More Fragments 필드가 Set 되어 있으면 이는 분할된 패킷임을 나타낸다.
Fragment offset 값이 0일 경우이는 분할된 패킷의 첫 번째 패킷임을 나타낸다.





< 1번 패킷 >


< 2번 패킷 (마지막 패킷) >


IPv4 헤더의 내용 중 Identification 필드의 값은 동일한 패킷임을 알려준다. [ 0x00b6 ]
(분할된 동일 패킷끼리는 동일한 값을 가지기 때문이다.)

분할된 패킷의 마지막 패킷은 IPv4 Header의 Flags -> More Fragments 필드가 Not Set 되어 있다.

수신 측에선 패킷이 모두 도착하면 Fragment offset 값이 낮은 순서대로 재조립 한다.








[출처] MTU / 패킷 재조립 - 2|작성자 육육

MTU / 패킷 재조립 - 1




MTU란 ?

Maximum Transmission Unit = 최대 전송 단위

즉 MTU란 하나의 패킷이 가질 수 있는 최대 크기를 말한다.

크기를 이렇게 나누어 놓은 이유는 데이터를 쪼개지 않고 하나의 커다란 덩어리로 전송을 하게 된다면
전송 과정 중 데이터에 손실을 입게 될 경우 그 데이터는 쓸모가 없어지기 때문이다.

하지만 데이터를 나누어서 전송을 한다면 손실된 부분만 다시 요청을 하여 그 부분만 다시 전송 받을 수 있으므로 신뢰성 있는 통신을 할 수 있다.


비슷한 예로 우리가 평소에 인도에서 흔히 볼 수 있는 보도블럭을 생각 해 보자.

만일 보도블럭이 나누어져 있지 않고 합쳐져 있다면 파손되었을 경우 전체를 교체해야 하지만
보도블럭이 나누어져 있으면 파손된 부분만 교체를 하면 되기 때문이다.



일단 패킷이 분할되는 크기를 보기 위하여 사진을 첨부하겠다.
< Source = 192.168.0.48 // Destination = 192.168.0.44 >

-l [n] = 전송할 byte 지정
-n [n] = count




Ping 전송시 패킷이 캡쳐된 부분의 패킷 길이를 보면 1514 byte 이다.
저 크기에서 Ethernet header 크기인 14 byte를 빼면 1500 byte가 나오는데, 이 값이 Ethernet 환경에서 기본 MTU 값이다.


근데 위의 스샷에서 Ping 전송시 -l 옵션을 주어 2000 byte를 전송 하였는데 왜 길이가 1514+562 
= 2076 byte 일까?

그 이유는 바로 패킷/프레임에 포장된 헤더 크기 때문이다.


우선 Ethernet 헤더부터 살펴 보겠다.


< Ethernet II Header >

1. Destination MAC address ( 6 byte ) = 송신지의 MAC 주소
2. Source MAC address ( 6 byte ) = 수신지의 MAC 주소
3. Type ( 2 byte ) = 상위 타입 ( 0x0800은 IP /// 0x0806은 ARP 등등...)

이더넷 헤더의 총 크기는 14 Byte 이다.



다음은 IPv4 헤더를 살펴 보겠다.




1. version ( 1 byte ) = IP 헤더에 사용된 IP 버전 정보 
2. Header length ( 1 byte ) = IP 헤더의 길이 
3. Differentiated Services Field ( 1 byte ) = 서비스 유형
4. Total Length ( 2 byte ) = IP 헤더 + 패킷에 포함된 데이터 크기
.
.
.
생략 ( IPv4 헤더를 따로 포스팅 할 예정...)

IPv4 헤더의 Header length 필드의 값이 IP 헤더의 길이를 나타낸다.
총 20 Byte 임을 알 수 있다.


첫번째 패킷에서의 데이터 크기는 1480 byte 임을 알 수 있다.
[ 총 크기(1514) - Ethernet Header(14) - IPv4 Header(20) = 1480 byte]



두번째 패킷도 Ethernet header 크기는 같다. 
하지만 다음 계층의 헤더 정보가 다르므로 한번 살펴보겠다.



[ 총 크기(562) - Ethernet Header(14) - IPv4 Header(20) = 528 byte]
데이터 크기가 528 byte 라는 것을 알 수 있다.

첫번째 패킷의 1480 byte + 두번째 패킷의 528 byte = 2008 byte ???
2008 byte가 나오는 이유는 ICMP 헤더 크기 때문이다.





ICMP 헤더의 크기는 총 8 byte 이므로 ICMP 헤더 크기를 빼주면 데이터 크기가 2000 byte 임을 
알 수 있다.



[출처] MTU / 패킷 재조립 - 1|작성자 육육

TCP 4 way handshake





네 방향 핸드셰이크란? 

TCP 기반의 통신은 맨 처음 데이터를 송/수신 하기위해 세 방향 핸드셰이크 절차를 수행한다.
송/수신 이전에 세션을 확립하는 절차이다.

네 방향 핸드셰이크는 세션을 종료하기 위해 수행하는 절차이다.



< 3 way handshake >



세 방향 핸드셰이크 과정에서는 SYN/ACK 플래그가 사용되었다. 

SYN = Synchronization
ACK = Acknowledgment




< 4 way handshake >


하지만 네 방향 핸드셰이크 과정에서는 FIN/ACK 플래그를 사용하게 된다. 

FIN = Finish
ACK = Acknowledgment



= = = = = = = = = = = = = = = = = = = =



1.  Client - > Server 연결 종료 요청






클라이언트는 [클라이언트 -> 서버] 방향으로 연결 종료를 위해 
TCP 제어 플래그에 FIN/ACK를 설정한 패킷을 전송 한다.

데이터 전송? = X
데이터 수신? = O

이 상태를 FIN_WAIT-1 상태 라고 한다.



= = = = = = = = = = = = = = = = = = = =



2. Server -> Client 확인 응답 
Server - > Client 연결 종료 요청



< Server -> Client 확인 응답 >





< Server -> Client 연결 종료 요청 >


클라이언트로 부터 연결 요청을 받은 서버는 
확인 응답으로 ACK 플래그를 설정하여 전송을 하게 되고


서버는 클라이언트로 보낼 데이터가 더이상 남아 있지 않으면 
서버->클라이언트 방향의 세션 종료를 요청하는 플래그가 설정된 패킷을 전송한다.

데이터 송신 = X
데이터 수신 = O

이 상태를 FIN_WAIT-2 라고 한다.





4가지 절차를 모두 수행하게 되면 클라이언트는
아직 도착하지 않은 느린 데이터를 위해 일정 시간 동안 
연결 종료를 하지 않고 포트를 개방 한 상태로 남아있게 된다.

이 상태를 TIME_WAIT 이라 한다.







[출처] TCP - 4 way handshake|작성자 육육

TCP 3 way handshake

삼방향 핸드셰이크란?

TCP 기반의 통신은 서로간의 신뢰성있는 통신을 하기 위하여 3 Way-Handshake 라는 절차를 통해 서로간의 원할한 통신이 가능한지 선행 절차를 수행하게 된다.
(데이터를 송 수신 하기 이전에 세션을 확립하는 절차)

- 목적지 호스트가 UP 상태인지 확인한다.
- 서로간의 원할한 패킷 흐름 유지가 가능하다.






< TCP 3 way handshake >


ACK = 확인 응답
SYN = 일련 번호



1. Client -> Server [일련번호 전송]
서버와 연결을 위해 맨 처음 [SYN] 플래그가 설정된 패킷을 송신한다.

Sequence number = 0







2. Server -> Client [확인응답 + 일련번호]
클라이언트로 부터 [SYN] 플래그가 설정된 패킷을 수신한 서버는
그에 대한 확인 응답으로 [ACK]를 설정하여 보냄과 같이 [SYN]을 같이 설정하여
하나의 패킷으로 송신한다.

Sequence number = 0
Acknowledgment number = 1 (1번 패킷의 sequence + 1)





3. Client -> Server [확인응답]
서버로부터 [SYN] 플래그가 설정된 패킷을 수신한 클라이언트는
확인 응답으로 [ACK] 플래그를 설정한 패킷을 서버로 송신

Sequence number = 0
Acknowledgment number = 1 (2번 패킷의 Sequence number + 1)



확인 응답 번호는 이전 패킷의 Sequence Number 보다 하나가 큰 값으로 설정되어 전송된다.

위의 절차가 정상적으로 끝나면 서로간의 데이터를 주고 받을 수 있는 상태가 된다.



SYN_SENT : 클라이언트에서 SYN 패킷을 송신 했지만 서버로부터 ACK를 받지 못한 상태
(1번에 해당)

SYN_RCVD : 서버에서 클라이언트로 SYN/ACK 패킷을 송신 하였지만 ACK 패킷을 수신받지 못한 상태 (2번에 해당)

ESTABLISHED : 서버-클라이언트 간의 3 way-handshake 상태가 끝난상태. 이 상태부턴 데이터 교환이 가능해진다 (3번에 해당)



[출처] TCP - 3 way handshake|작성자 육육

DHCP 패킷 분석 - 2






DHCP Discover
DHCP Offer
DHCP Request
DHCP ACK 

4개의 패킷을  차례대로 살펴 보겠습니다.





< DHCP Discover >


1. DHCP Discover

IP 주소를 동적으로 할당 받기를 원하는 클라이언트는 DHCP 서버를 찾기 위해 DHCP Discover 패킷을 목적지 255.255.255.255 로 송신한다. 즉 Broadcast로 패킷을 전파 한다.
;
;
(1) Message type : boot Request

Message type 필드의 값을 보면 패킷이 요청인지 응답인지 알 수 있다.
(1은 요청, 2는 응답)
클라이언트가 DHCP 서버를 찾기 위해 송신 하므로 1의 값이 설정된다.
(DHCP 서버는 응답을 해달라는 요청을 하는 것이기 때문이다.)
;
;
(2) Transaction ID : 0x6b3d8569

하나의 request, reply는 동일한 Transaction ID를 가진다.
이 필드에 0x00000001의 값이 설정되어 요청을 한다면
그에 대한 응답을 받을 때, 0x00000001의 값이 설정 되어 응답을 받는다.
;
;
(3) Bootp flags : 0x0000 (unicast)

Bootp flags 필드의 Broadcast flag 가 1로 설정 되면 서버가 이 패킷을 수신하여 응답을 할 때 Broadcast로 응답 하게 된다사진엔 보이지 않지만 이 값이 0으로 설정 되어 있으므로 이 패킷에 대한 응답을Unicast로 하게 된다.
(서버에게 어느 유형으로 응답을 해달라는 요청 정도로 보면 된다.)
;
;
(4) option: (53) DHCP Message Type

이 필드는 DHCP 패킷이 어느 유형의 패킷인지 나타낸다현재 필드에선 값이 1로 되어 있는데이는 즉DHCP Discover 패킷 임을 알 수 있다.
;
;
;
(5) option: (55) Parameter Request List

이 필드는 클라이언트가 서버로 IP 주소 할당 요청을 하여 그에 대한 응답을 받을 때추가로 받고 싶은 요청 목록이다.
DNS 서버 도메인과 주소, Gateway 주소 등등 여러 가지를 요청 할 수 있다.
;
;







< DHCP Offer >

2. DHCP Offer

클라이언트로 부터 DHCP Discover 패킷을 수신한 서버는 DHCP Offer 패킷으로 응답을 한다.
이 패킷에는 클라이언트에게 할당 가능한 IP 주소와 여러 정보들을 담고 있다.
;
;
(1) Message type = boot Reply (2)

DHCP Offer 패킷은 클라이언트로부터 받은 요청에 대한 응답 패킷이다.
그러므로 이 필드의 값이 2로 설정 되어 있다.
(1=요청 / 2=응답)
;
; 
(2) Transaction ID : 0x6b3d8569

하나의 request, reply 패킷은 이 필드의 동일한 값을 가진다고 위에서 설명 하였다.
위의 DHCP Discover 패킷과 현재 보고 있는 DHCP Offer 패킷을 보면 이 필드의 값이 동일 하므로
하나의 요청에 대한 응답은 이 필드의 값이 같다는 것을 알 수 있다.
;
;
(3) Your (client) IP address: 172.16.99.2 (172.16.99.2)

이 필드의 값은 임대 가능한 IP 주소이다즉 서버에서 제공하려는 주소가 이 필드에 나타나 있다.
;
(4) Client MAC address : vmware_04:9c:c8 (00:0c:29:04:9c:c8)

이 필드는 IP 주소를 제공받을 클라이언트의 MAC 주소가 들어있다.
;
;
(5) option: (53) DHCP Message Type

현재 이 필드에 2의 값이 설정 되어 있다. 2는 DHCP Offer 패킷임 을 나타낸다.
;
;
(6) option~

DHCP 서버는 클라이언트에게 IP 주소 할당을 함과 같이 다른 여러 가지 정보들을 같이 전송한다.
이 옵션이 바로 여러 가지 정보들이다사진을 보면 DHCP 서버 주소임대기간서브넷게이트웨이 등등 여러 가지 정보들을 담고 있다.
;
;
!!!
DHCP Offer 패킷을 수신한 클라이언트는 IP 주소를 바로 사용 하지 않는다.

왜냐하면 여러 DHCP Server로 부터 DHCP Offer 패킷을 수신 하게 되면 그중 가장 빨리 수신한 패킷을 
낸 서버와 두 가지의 절차를 더 수행 한 후 완전히 IP 주소를 할당 받아 사용 할 수 있게 된다.

즉 DHCP Offer 패킷은 클라이언트에게 "나는 이런 IP 주소를 할당 해 줄 수 있다" 라고 제의를 할 뿐 할당을 하는 것은 아니라고 볼 수 있다.
;






< DHCP Request >

3. DHCP Request

클라이언트가 DHCP 서버로 부터 DHCP Offer 패킷을 수신 하면 DHCP Request 패킷을 송신한다.
DHCP 서버로부터 "이런 IP 주소를 할당 해 줄수 있다라는 DHCP Offer 패킷을 받게 되면 클라이언트는 서버에게 "그 IP 주소를 사용 해도 되겠냐?" 라는 의미의 DHCP Request 패킷을 보내게 된다.
만일 여러대의 DHCP 서버로 부터 DHCP Offer 패킷을 수신 하였다면 맨 처음 도착한 DHCP Offer 메세지를 송신한 서버로 DHCP Request 패킷을 보내게 된다.
;
;
(1) Message type : boot Request (1)
DHCP Request 패킷은 이름에서도 볼 수 있듯이 요청을 하는 패킷이므로 1의 값이 설정 되어 있다.
(1=요청 / 2=응답)
;
;
(2) option: (53) DHCP Message Type
이 필드에 3의 값이 설정 되어 있으므로 이 패킷은 DHCP Request 패킷 임을 나타낸다.
;
;
(3) option: (50) Requested IP Address
이 필드에는 DHCP Offer 패킷의 Your (client) IP address 필드의 아이피 주소가 이곳에 들어가게 된다.
서버는 클라이언트에게 Offer 패킷으로 난 너에게 n.n.n.n IP 주소를 할당 해 줄 수 있어” 라는
제의를 하게 되고 클라이언트는 서버에게 DHCP Request 패킷으로 “n.n.n.n의 아이피를 사용해도 괜찮냐?” 라는 요청을 보내게 된다.
;
;
(4) option: (54) DHCP Server Identification
DHCP Request 패킷을 수신 할 서버의 IP 주소가 이 필드에 나타나 있다.
;
;





< DHCP ACK >

4. DHCP ACK 

서버는 클라이언트로 부터 DHCP Request 패킷을 송신 하게 되면 그에대한 응답으로 ACK 패킷을 보내게 된다. (ACK = Acknowledgment // 인정, 승인, 답신 등등 허용한다는 뜻을 가지고 있다)

이 과정이 끝나면 비로소 클라이언트는 할당받은 IP를 사용할 수 있게 되고, 서버는 자신의 DB에 정보를 기록하게 된다.
;
;
(1) Message type : boot Reply (2)

클라이언트에게 최종 응답을 해주는 것 이므로 2의 값이 설정 되어 있다.
(1=요청 / 2=응답)
;
;
(2) option: (53) DHCP Message Type 
현재 DHCP ACK 패킷에는 5의 값이 설정 되어 있다. 즉 5의 값이 설정 되어 있으면 DHCP ACK 패킷 임을 나타낸다.
;
;




[출처] DHCP 패킷 분석 - 2|작성자 육육