iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
1

上一節講了TCP的原理,這裡就是實驗證明的環節了!第一步,還是要寫程式去解析TCP的header
同UDP,我們的packet前面已經解析了長度為14的第二層鏈接層header以及長度為20的第三層ip層header,TCP的header長度有20,header的結構如下所示

對應的python程式如下

src_port, dest_port, seq, ack_num, offset, flags, window, checksum, urgent_ptr= struct.unpack('!HHLLBBHHH' , packet[34:54])

先說一下flags,flags由八位二進制的數字組成,每一位代表相應的flag有沒有被啟用,加入最重要的第四位為1,也就是ACK被啟用了,ACK被啟用了,ack_num才有作用

對應在。。。的parse_tcp函數部分,接下來是實驗的環節,tcp有連接創建,封包傳輸和連接終止三個部分,首先從連接創建開始

連接創建:三方交握
依照Day04的環境,我們在HostA上起一個TCP server,在HostB去connect他
首先,在router啟動監聽程式
在HostA下

nc -l hostA_ip 8088 #起server

在HostB下

nc -v  hostA_ip 8088  # 用tcp的方式連hostA_ip

就能監聽到三方交握的過程

Source Mac: 02:42:ac:11:00:05 Destination Mac: 02:42:ac:11:00:02 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 52755 TTL: 63 Protocol: TCP Source IP: 172.18.0.3 Destination IP: 172.17.0.5
{'SRC_PORT': 40786, 'DEST_PORT': 8088, 'SEQ': 3660055744, 'ACK_NUM': 0, 'Flags': '_,_,_,_,_,_,SYN,_', 'RESERVE': 0, 'TCP_LENGTH': 10, 'WINDOW': 29200, 'CHECKSUM': 22618, 'PTR': 0, 'data': b'\x02\x04\x05\xb4\x04\x02\x08\nHW\xcd%\x00\x00\x00\x00\x01\x03\x03\x07’}
------------------------
Source Mac: 02:42:ac:11:00:02 Destination Mac: 02:42:ac:11:00:05 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 0 TTL: 64 Protocol: TCP Source IP: 172.17.0.5 Destination IP: 172.18.0.3
{'SRC_PORT': 8088, 'DEST_PORT': 40786, 'SEQ': 3785319458, 'ACK_NUM': 3660055745, 'Flags': '_,_,_,ACK,_,_,SYN,_', 'RESERVE': 0, 'TCP_LENGTH': 10, 'WINDOW': 28960, 'CHECKSUM': 22618, 'PTR': 0, 'data': b'\x02\x04\x05\xb4\x04\x02\x08\n\xbd\x13`\xc3HW\xcd%\x01\x03\x03\x07’}
------------------------
Source Mac: 02:42:ac:11:00:05 Destination Mac: 02:42:ac:11:00:02 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 52756 TTL: 63 Protocol: TCP Source IP: 172.18.0.3 Destination IP: 172.17.0.5
{'SRC_PORT': 40786, 'DEST_PORT': 8088, 'SEQ': 3660055745, 'ACK_NUM': 3785319459, 'Flags': '_,_,_,ACK,_,_,_,_', 'RESERVE': 0, 'TCP_LENGTH': 8, 'WINDOW': 229, 'CHECKSUM': 22610, 'PTR': 0, 'data': b'\x01\x01\x08\nHW\xcd%\xbd\x13`\xc3’}

可以根據結果與前一天介紹的三方交握做比對

封包傳輸
直接在HostB上輸入字串,按Enter代表輸入結束,這裡輸入兩個字串,分別為hello和hi

># nc -v  172.17.0.5 8088
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 172.17.0.5:8088.
hello
hi
Source Mac: 02:42:ac:11:00:05 Destination Mac: 02:42:ac:11:00:02 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 52757 TTL: 63 Protocol: TCP Source IP: 172.18.0.3 Destination IP: 172.17.0.5
{'SRC_PORT': 40786, 'DEST_PORT': 8088, 'SEQ': 3660055745, 'ACK_NUM': 3785319459, 'Flags': '_,_,_,ACK,PSH,_,_,_', 'RESERVE': 0, 'TCP_LENGTH': 8, 'WINDOW': 229, 'CHECKSUM': 22616, 'PTR': 0, 'data': b'\x01\x01\x08\nH\\y\xca\xbd\x13`\xc3hello\n’}
------------------------
Source Mac: 02:42:ac:11:00:02 Destination Mac: 02:42:ac:11:00:05 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 44784 TTL: 64 Protocol: TCP Source IP: 172.17.0.5 Destination IP: 172.18.0.3
{'SRC_PORT': 8088, 'DEST_PORT': 40786, 'SEQ': 3785319459, 'ACK_NUM': 3660055751, 'Flags': '_,_,_,ACK,_,_,_,_', 'RESERVE': 0, 'TCP_LENGTH': 8, 'WINDOW': 227, 'CHECKSUM': 22610, 'PTR': 0, 'data': b'\x01\x01\x08\n\xbd\x18\riH\\y\xca’}
------------------------
Source Mac: 02:42:ac:11:00:05 Destination Mac: 02:42:ac:11:00:02 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 52758 TTL: 63 Protocol: TCP Source IP: 172.18.0.3 Destination IP: 172.17.0.5
{'SRC_PORT': 40786, 'DEST_PORT': 8088, 'SEQ': 3660055751, 'ACK_NUM': 3785319459, 'Flags': '_,_,_,ACK,PSH,_,_,_', 'RESERVE': 0, 'TCP_LENGTH': 8, 'WINDOW': 229, 'CHECKSUM': 22613, 'PTR': 0, 'data': b'\x01\x01\x08\nH\\\x81N\xbd\x18\rihi\n’}
------------------------
Source Mac: 02:42:ac:11:00:02 Destination Mac: 02:42:ac:11:00:05 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 44785 TTL: 64 Protocol: TCP Source IP: 172.17.0.5 Destination IP: 172.18.0.3
{'SRC_PORT': 8088, 'DEST_PORT': 40786, 'SEQ': 3785319459, 'ACK_NUM': 3660055754, 'Flags': '_,_,_,ACK,_,_,_,_', 'RESERVE': 0, 'TCP_LENGTH': 8, 'WINDOW': 227, 'CHECKSUM': 22610, 'PTR': 0, 'data': b'\x01\x01\x08\n\xbd\x18\x14\xecH\\\x81N’}

可以看到data結尾能看到我們傳出去的字串,而傳出去的封包會伴隨著一個response封包,代表server通知client有正確接收了,我們還能看到發送的ACK_NUM都一致

連接中止
在HostB的地方按下Ctrl-D,就能終止連接

Source Mac: 02:42:ac:11:00:05 Destination Mac: 02:42:ac:11:00:02 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 60508 TTL: 63 Protocol: TCP Source IP: 172.18.0.3 Destination IP: 172.17.0.5
{'SRC_PORT': 40790, 'DEST_PORT': 8088, 'SEQ': 1518804903, 'ACK_NUM': 3345654987, 'Flags': '_,_,_,ACK,_,_,_,FIN', 'RESERVE': 0, 'TCP_LENGTH': 8, 'WINDOW': 229, 'CHECKSUM': 22610, 'PTR': 0, 'data': b'\x01\x01\x08\nHb\t\xb5\xbd\x1d\x8d\xf5’}
------------------------
Source Mac: 02:42:ac:11:00:02 Destination Mac: 02:42:ac:11:00:05 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 23758 TTL: 64 Protocol: TCP Source IP: 172.17.0.5 Destination IP: 172.18.0.3
{'SRC_PORT': 8088, 'DEST_PORT': 40790, 'SEQ': 3345654987, 'ACK_NUM': 1518804904, 'Flags': '_,_,_,ACK,_,_,_,FIN', 'RESERVE': 0, 'TCP_LENGTH': 8, 'WINDOW': 227, 'CHECKSUM': 22610, 'PTR': 0, 'data': b'\x01\x01\x08\n\xbd\x1d\x9dSHb\t\xb5’}
------------------------
Source Mac: 02:42:ac:11:00:05 Destination Mac: 02:42:ac:11:00:02 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 60509 TTL: 63 Protocol: TCP Source IP: 172.18.0.3 Destination IP: 172.17.0.5
{'SRC_PORT': 40790, 'DEST_PORT': 8088, 'SEQ': 1518804904, 'ACK_NUM': 3345654988, 'Flags': '_,_,_,ACK,_,_,_,_', 'RESERVE': 0, 'TCP_LENGTH': 8, 'WINDOW': 229, 'CHECKSUM': 22610, 'PTR': 0, 'data': b'\x01\x01\x08\nHb\t\xb5\xbd\x1d\x9dS'}

上一節提到連接中止透過四向揮手,但是看到上面的log只有三次傳輸,這是因為client傳FIN給server之後,server沒有東西要傳,所以就直接ACK和FIN一起傳出去。

系列的成果將會放在這:https://github.com/kaichiachen/pytcpdump
文章配合著程式碼有助於學習 :)


上一篇
Day13 解析第四層-TCP的封包結構(1)
下一篇
Day15 解析第五層-HTTP的封包結構
系列文
那些年還給老師的TCP/IP五層結構 - 用Python進行網路封包分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言