1. 서버에 연결하기 위해 전송 되는 SYN 패킷
패킷분석 (순서는 Segment
-> Datagram -> Frame)순
본 패킷은 www.dankook.ac.kr
대학으로 접속하는 경로이며,
이 주소의 IP는 203.237.226.85이다.
1) TCP header(20bytes + 12bytes as option)
a) Source port : 1718 // 응용프로그램의 포트번호
b) Destination port : http(80) // 예약된 http 포트넘버를 쓴다, 최초 http서버로 접속
c) Sequence number : 0 // relative value이며 실제로는 client에서 생성한 랜덤한 값이 들어간다.
d) Acknowledge number : 0 // 최초 SYN 패킷을 보낼 때는 항상 0으로 초기화 된다.
e) Header length : 32 bytes // 20 bytes(Original header) + Option(
f) Flag : 0x02 // SYN flag만 Set 되어있는 상황이다.
g) Window size : 8192 // Window size는 현재 recv buffer가 비어있는 크기를 말한다.
h) Check sum // CRC를 이용하여 checksum을 수행한다(4byte)
i) Urgent point : 0 // 긴급한 data가 아니므로, 이 부분은 비어져 있다.
j) Option (12bytes)
i)
Maximum segment size(MSS) : 1460 // TCP의 옵션 부분이며, TCP 혹은 IP헤더로 count되지 않는다.
(4bytes) //
Header + MSS <= MTU 여야 하며, 이 값은 하나의 segment가 가지는 최대 크기이다.
//
MTU가 1500으로 설정되어 있으므로 1500 – 20(IP header) + 20(TCP header) = 146
ii)
Window scale(3bytes) : 2 // receive buffer(Window size)를 증가시키기 위한 옵션으로 power(2, ws)로 표현된다.
//
이 경우 buffer는 8192 * power(2,2) 므로 총 32768
byte로 확장되게 된다.
iii)
SACK_PERM(2bytes) : 1 // 송,수신시 다양한 패킷의 손실을 예방하기 위해서 만들어 졌으며,
(RFC 2018기준) // 수신자는 송신자에게 모든 segment를 성공적으로 도착했음을 알리는 역할을 한다.
2) IPv4 Header(20bytes)
a) Version : 4 // IPv4를 나타낸다
b) Header length : 20 // 헤더의 크기를 나타낸다
c) Service : 0x00 // Default service를 나타낸다
d) Total length : 52 // Datagram의 크기를 나타낸다, TCP는 encapsulated 되었다.
e) Identification : 0x2853 // datagram ID를 나타낸다
f) Flags : 0x02 // Don’t fragment, 데이터를 나누지 않는다.
g) Fragment offset : 0 // SYN packet은 Fragment offset을 가질 필요가 없다.
h) Time to live = 128 // 보통 256으로 초기화 되며, Hop을 지날때마다 한개씩 감소하게 된다.
i) TYPE = TCP(6) // TCP를 캡슐화 한 IP 헤더이다
j) Checksum // 총 2바이트의 Checksum, 오류 체크를 한다.
k) Source IP addr : 192.168.0.3 // 송신자의 IP주소를 나타낸다(공유기를 썻기 때문에 가상 IP주소가 나타났다.)
l) Dest IP addr : 203.237.226.85 // 목적지 IP주소를 나타낸다 www.dankook.ac.kr 서버의 IP주소이다.
3) Ethernet header(14bytes)
a) Destination(6bytes) // 수신자 MAC(Media access control) 주소를 나타낸다.
b) Source(6bytes) // 송신자 MAC 주소를 나타낸다
c) TYPE : IP(2bytes) // IP Protocol을 캡슐화한 Ehternet frame이다.
총 패킷의 크기는 20(TCP header) + 12(TCP option) +
20(IP header) + 14(Ethernet header) = 66
bytes 가
wireShark에 표시되는 총 byte이며WireShark은 Ethernet의 Presemble(8byte)
및 CRC(4bytes)를 나타내지 않기 때문에
실제 크기는 66 + 12 = 78bytes가 된다.
2. 1024바이트의 데이터를 전송하는 TCP 패킷
직접 프로그램을 만들어서 그 프로그램이 1024 바이트를 전송하도록 하였다.
1) TCP header(20bytes + 12bytes as option)
a) Source port : 4821 // 송신자 응용프로그램의 포트번호
b) Destination port : 7500 // 만든 프로그램의 port번호가 7500이였다.
c) Sequence number : 1 // three way hand-shaking을 한 바로 직후에는 sequence number가 relative 값으로1이다.
d) Acknowledge number : 1 // relative acknowledge 값 역시 1이다(단순히 1024만 전송했기 때문에 다음에 올 값은 없다)
e) Header length : 22 bytes // 20 bytes(Original header size)
f) Flag : 0x18 // PSH(버퍼가 비어져 있어도 즉시 전송) + ACK가 set되어 있다.
g) Window size : 4380 // Window size는 현재 recv buffer가 비어있는 크기를 말한다.
h) Check sum // CRC를 이용하여 checksum을 수행한다(4byte)
i) Urgent point : 0 // 긴급한 data가 아니므로, 이 부분은 비어져 있다.
j) Data 영역은 1024byte로 채워져 있다.
2) IPv4 Header(20bytes)
a) Version : 4 // IPv4를 나타낸다
b) Header length : 20 // 헤더의 크기를 나타낸다
c) Service : 0x00 // Default service를 나타낸다
d) Total length : 1064 // 1024(Data) + 20(IP) + 20(TCP)
e) Identification : 0x0985 // datagram ID를 나타낸다
f) Flags : 0x02 // Don’t fragment, 데이터를 나누지 않는다.
g) Fragment offset : 0 // SYN packet은 Fragment offset을 가질 필요가 없다.
h) Time to live = 128 // 보통 256으로 초기화 되며, Hop을 지날때마다 한개씩 감소하게 된다.
i) TYPE = TCP(6) // TCP를 캡슐화 한 IP 헤더이다
j) Checksum // 총 2바이트의 Checksum, 오류 체크를 한다.
k) Source IP addr : 192.168.0.3 // 송신자의 IP주소를 나타낸다(공유기를 썻기 때문에 가상 IP주소가 나타났다.)
l) Dest IP addr : 14.47.140.40 // 목적지 IP주소를 나타낸다, 본인 친구의 컴퓨터와 통신하였다.
3) Ethernet header(14bytes)
a) Destination(6bytes) // 수신자 MAC(Media access control) 주소를 나타낸다.
b) Source(6bytes) // 송신자 MAC 주소를 나타낸다
c) TYPE : IP(2bytes) // IP Protocol을 캡슐화한 Ehternet frame이다.
총 데이터 크기는
1024byte(data) + 20byte(TCP header) +
20byte(IP header) + 14(Ethernet header) + 8(preamble) + 4(CRC) = 1090 byte가 된다
3. 시간초과 오류를 나타내는 ICMP 패킷
Window 환경 내에서TraceRt를 이용하여서 Time-excceded ICMP 패킷을 만들었다.
1) ICMP(4byte + 36bytes(Data))
a) Type : 11 // Type 11은 Time-exceeded를 나타낸다
b) Code : 0 // Type ==11 && Code == 0 은TTL expired in transit를 의미한다.(전송 시간 초과)
c) CheckSum(4bytes) // 데이터 오류를 체크
d) Data part는 tracert를 수행했을 때 IPv4 헤더 + ICMP의 헤더로 채워져 있다.
i) IPv4 header(20bytes)
(1) Version : 4 // IPv4를 의미한다.
(2) Header Length : 20 // ICMP Data에 캡슐화되어있는 IP의 헤더 크기
(3) Service : 0x00 // 기본 서비스
(4) Total length : 92 // 총 크기를 나타낸다(왜 92가 되는지는 확실히 모르겠다)
(5) ID // IP의 식별자
(6) Flags : 0x00 // 0은 예약된 bit이다.
(7) Frag offset : 0 // Fragment offset을 나타낸다
(8) Time to live : 1 // Time to live가 1에서 0이 되는 순간 Router는 ICMP를 다시 보내게 된다.
(9) Protocol : ICMP // ICMP를 캡슐화하고 있던 IP이다.
(10) CheckSum // 오류검출 기능
(11) Source : 192.168.0.3 // 송신자 IP 주소
(12) Dest : 203.238.226.85 // 수신하 IP 주소
ii) ICMP header (8bytes)
(1) TYPE : 8 // Tracert를 썻기 때문에 Echo request를 이용하였다.
(2) Code : 0 // Echo request를 의미한다(Type과 같이 쓰임)
(3) CheckSum // 오류 검출기능
(4) The rest of ICMP(4bytes) 는 Identifier와 Sequence number 정보로 이뤄져 있다
(a) Identifier(BE) // BE는 Big-endian을 의미한다.
(b) Identifier(LE) // LE는 Little-endian을 의미한다.
(c) Sequence number(BE) // Sequence number를 Big-Endian으로 나타냄
(d) Sequence number (LE) // Sequence number를 Little-Endian으로 나타냄
2) IPv4
a) Version : 4 // IPv4를 나타낸다
b) Header length : 20 // 헤더의 크기를 나타낸다
c) Service : 0x00 // Default service를 나타낸다
d) Total length : 56 // Datagram의 크기를 나타낸다, ICMP는 encapsulated 되었다.
e) Identification : 0x6a59 // datagram ID를 나타낸다
f) Flags : 0x00 // 예약되어 잇다.
g) Fragment offset : 0 // SYN packet은 Fragment offset을 가질 필요가 없다.
h) Time to live = 248 // 보통 256으로 초기화 되며, Hop을 지날때마다 한개씩 감소하게 된다.
i) TYPE = ICMP(1) // ICMP를 캡슐화 한 IP 헤더이다
j) Checksum // 총 2바이트의 Checksum, 오류 체크를 한다.
k) Source IP addr : 203.237.226.85 // 이 IP data는 router로부터 온 데이터이다.
l) Dest IP addr : 192.168.0.3 // 내 자신의 주소가 된다.
3) Ethernet(14 bytes)
a) Destination(6bytes) // 수신자 MAC(Media access control) 주소를 나타낸다.
b) Source(6bytes) // 송신자 MAC 주소를 나타낸다
c) TYPE
: IP(2bytes) //
IP Protocol을 캡슐화한 Ehternet frame이다.
따라서 총 크기는
4byte(ICMP 헤더) + 36byte(ICMP Data part) + 20byte(IP header) +
14byte(Ethernet header)
+
8byte(Preamble) + 4byte(CRC) = 82byte 가 된다.
4. Echo request의 ICMP 패킷
Command Prompt에서 ping 명령을 수행하였으며 대상은 www.dankook.ac.kr 이였음. OS는 windows7 이다.
1) ICMP(8byte + 32bytes(Data))
a) Type : 8 // Type 8은 Echo (Ping) request를 나타낸다.
b) Code : 0 // Type ==8 && Code == 0 은Echo (Ping) request를 나타낸다.
c) CheckSum(4bytes) // 데이터 오류를 체크
d) Identifier(BE) : 1 // Ping process ID로 사용되어진다 BE는 Big-Endian을 의미한다.
e) Identifier(LE) : 256 // Ping process ID로 사용되어진다 LE는 Little-Endian을 의미한다.
f) Sequence number(BE) : 38 // Ping의 순서를 의미한다 이 값은 1씩 증가하게 된다(몇번쨰 핑인지 알 수 있다)
g) Sequence number (LE) : 2560 // Ping 순서를 의미하며 Little Endian방식으로 표현하였다.
h) Data(32bytes) // 아무 의미없는 데이터로 채워지며 windows의 경우 alphabet으로 32bytes가 채워진다.
2) IPv4
a) Version : 4 // IPv4를 나타낸다
b) Header length : 20 // 헤더의 크기를 나타낸다
c) Service : 0x00 // Default service를 나타낸다
d) Total length : 60 // Datagram의 크기를 나타낸다, ICMP는 encapsulated 되었다.
e) Identification : 0x7fe6 // datagram ID를 나타낸다
f) Flags : 0x00 // 예약되어 있다.
g) Fragment offset : 0 // SYN packet은 Fragment offset을 가질 필요가 없다.
h) Time to live = 128 // 보통 256으로 초기화 되며, Hop을 지날때마다 한개씩 감소하게 된다.
i) TYPE = ICMP(1) // ICMP를 캡슐화 한 IP 헤더이다
j) Checksum // 총 2바이트의 Checksum, 오류 체크를 한다.
k) Source IP addr 192.168.0.3 // Ping을 요청한 내 자신의 IP주소이다
l) Dest IP addr : 203.237.226.85 // 단국대 서버로 ping 테스트를 해 보았다.
3) Ethernet(14 bytes)
a) Destination(6bytes) // 수신자 MAC(Media access control) 주소를 나타낸다.
b) Source(6bytes) // 송신자 MAC 주소를 나타낸다
c) TYPE : IP(2bytes) // IP Protocol을 캡슐화한 Ehternet frame이다.
따라서 총 크기는 8(ICMP 헤더) + 32(ICMP Data part) + 20(IP header)
+ 14(Ethernet header) +
8(Preamble) + 4(CRC) = 86 bytes가 된다.
'Programming > Network Programming' 카테고리의 다른 글
TCP programming basis (0) | 2011.10.28 |
---|---|
.. no regret.. (0) | 2011.10.26 |
The example of one server that sends a client ID (0) | 2011.10.15 |
get client IPadrress in server side (0) | 2011.10.10 |
Reference for unix socket api (0) | 2011.09.29 |