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
Posted by 박세범