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가 된다.