windump를 이용하여 tcp 패킷을 분석해 보았다.
아래와같은 명령어로 실행하였다.
기본적인 사용법과 다운로드는 여기 링크 참조!! -> Link
(1번 네트워크 인터페이스의 7778번 포트를 감청)
서버쪽에서는 nc -l -p 7778 을 사용하여 7778번 포트를 열어 접속을 기다리게 하였다.(리눅스 서버)
클라이언트에서는 nc를 사용하여 7778번 포트에 접속한다음 hello 라는 문자열을 보내고 ctr + c 하여 접속을 끊었다.(윈도우 클라이언트)
TCP 통신 패킷 분석
tcp/ip 통신은 안정형 통신 방법으로 데이터를 주고 받을때마다 ACK 및 S/N 번호로 데이터가 오고가는 순서를 보장할수있다. 일명 3 Way Handshake 기법인데 windump 를 통해 패킷을 분석해 보았다.
1) 연결 할때
우선 내컴퓨터의 네트워크 인터페이스 카드에 대한 정보는 아래와 같다.
(mac 주소 및 IP 주소)
nc를 이용하여 접속했을때 나온 패킷 덤프는 아래와 같다.
Ethernet header (빨간색 박스)
Dest addr(6 byte) => 00:09:97:c7:26:07
Src addr(6 byte) => 00:24:be:66:ef:b8
Type ( 2byte ) => 0x0800 (IP packet)
IP header (이어서 빨간색 박스)
version(4 bit)+header length(4 bit)+type of service(8 bit)+total length(16 bit)
+identification(16 bit)+flags(3 bit)+fragment offset(13 bit)
+time to live(8 bit)+protocol(8 bit)+header checksum(16 bit)
+source IP address(32 bit)
+dest IP address(32 bit)
version(4 bit)+header length(4 bit) => 0x45
0100 0101(2) 여기서 0100이 header version : 4, header length는: 0101, 즉 5
type of service => 0
total length => 0x30
idectification(2 byte) => 0x3803
flags (3bit) => 0x04 : 패킷을 분할하지 않겠다는 뜻, fragment offset(13bit)=>패킷 조각 오프셋: 0x0
time to live(1 byte) => 0x80 TTL: 128
protocol( 1byte) => 0x06 : TCP 패킷이라는 뜻
check sum(2byte) = 0x0000
source IP address( 4 byte) => a5 f6 43 d3 => 해당 헥스 값을 10진수로 바꾸면 IP주소가됨
0xaf : 165 0xf6: 246 0x43: 67 0xd3: 211
dest IP address(4 byte) => a5 f6 0c d7
0xaf : 165 0xf6: 246 0x0c :12 0xd7: 215
TCP Header (노란색 박스)
source port number(16)+dest port number(16)
+ sequence number(32)
+ acknowledgment number(32)
+ header length(4)+reserved(6)+URG+ACK+PSH+RST+SYN+FIN+window size(16)
+ TCP checksum(16)+urgent pointer(16)
sequence number=ISN(Initial Sequence Number)
+ (# of bytes sent so far in this tcp connection)
acknowledgment number=next sequence number expected from the other part
source port number (2 byte) => 0x b6 8b : 46731
dest port number (2 byte) => 0x 1e 62 : 7778
sequence number (4 byte) => 0x f1 01 c7 00 : 4,043,425,536
acknowledgment number (4 byte) => 0x00 00 00 00
length(4)+reserved(6)+URG+ACK+PSH+RST+SYN+FIN =>
0x70 02 => 0111 0000 0000 0010 (2)
header length( 4bit ) => 7 (4 바이트 단위 이므로 * 4) : 28
- Control flag bit 정보
URG |
ACK |
PSH |
RST | SYN | FIN |
flag bit ( 6 bit) => 00 00 10 즉 SYN 패킷
window size (2 byte) => 0x2000 ( 8192)
check sum ( 2 byte) => 0x9cb9 ( 40121)
urgent pointer(2 byte) => 0x00
초록색 박스
클라이언트에서 sequence number를 0xf101c700로 서버에게 보냈을 때 다시 서버에서는 sequence number +1을 하여 acknowledgment number(0xf101c701)을 보내 주었다.
서버에서는 Code bit를 7011 Code bit만 ( 01 00 10)으로 표현할수 있는데 이는 SYN/ACK 를 다시 클라이언트에게 응답을 해줌
주황색 박스
이후 클라이언트는 서버에서 보내준 sequence number(0x46623e05)에 +1을 하여 acknowledgment number(0x46623e05)을 보내어줘서 잘 받았다고 알려주고 Code bit에 01 00 00 패킷(ACK)을 보내주고 이제 통신을 하기 위한 3 Way HandShake의 절차를 마쳤음.
2) 데이터 전송 하고 연결을 끊을때
Dest addr(6 byte) => 00:09:97:c7:26:07 (서버)
Src addr(6 byte) => 00:24:be:66:ef:b8 (클라이언트)
Type ( 2byte ) => 0x0800 (IP packet)
Control flag bit 정보
URG | ACK | PSH | RST | SYN | FIN |
화면에서 유심히 봐야 할 내용을 박스로 쳤는데, 파란 박스는 SequenceNumber와 Acknowledeg Number 그리고 빨간 박스는 데이터, Flag 비트는 노란색으로 표시 하였다.
1번 패킷을 보내는 것은 클라이언트 hello라는 내용을 gets로 입력받아서 서버에게 보내주는 패킷 내용입니다. SequenceNumber을 0xf10f7c01로 보내 주었고, 플래그 비트는 011000 으로 표시 될수 있는데 이전 패킷을 잘 받았다는 표시 ACK와 PSH : Push. Buffer를 따로 플래그로 두워 보내는데, 채워지는것을 기다리지 않고 데이터를 전달한다는 뜻으로 해석된다.
2번 패킷은 1번 패킷을 잘받았다는 플래그비트 ACK을 클라이언트에게 보내주며 Acknowledeg Number는 클라이언트에서 보내어준 SequenceNumber 0xf10f7c01에서 클라이언트에게 받은 데이터의 개수(5)를 더해서 0xf10f7c06을 보내어 주었다.
3번 패킷은 클라이언트가 이제 접속을 종료하겠다는 패킷을 보내준 내용. 플래그 비트가 010001으로 ACK와 FIN 플래그 비트가 셋팅 되어 있습니다.
4번 패킷은 서버가 이제 클라이언트의 종료를 잘받았다고 ACK 플래그를 보내주고 접속을 서로 끊음.
'IT > WinpcapProgramming' 카테고리의 다른 글
TCP 패킷 체크섬(Checksum) C언어로 구현하기 (0) | 2015.07.31 |
---|---|
TCP/IP IP 패킷 체크섬(Checksum) C언어로 구현하기 (1) | 2015.04.25 |
windump 사용법 (0) | 2015.04.03 |
Winpcap 프로그래밍 - 패킷 스니핑 (감청/분석) 하기 (0) | 2015.03.31 |
TCP,IP,Ethernet 헤더 구조체 (0) | 2015.03.31 |