【摘要】本文重點分析計算機網絡中TCP協議中的握手和揮手的過程。
前段時間忽然看到了一篇關於TCP/IP模型的文章,心想這段時間在家裏也用wireshark抓了點包,那麼想着想着就以爲須要複習一下網絡知識,因而就有這篇博文的誕生。固然網上關於TCP相關的知識點也是芸芸,閒着無事也能夠多google深刻理解一下,本文重點在分析TCP協議中的握手和揮手的過程。html
既然要抓包,個人裝備是我的電腦,操做系統是Mac OS。抓包工具是wireshark,至於怎麼安裝和一些基本的操做,能夠點擊參考這篇文章。python
用本地電腦模擬server和client,都是localhost的地址,可是我選擇的是不一樣的端口進行標識。server的端口號:12345;client的端口號:50784。由於是用的本機作的實驗,因此wireshark監聽的不是網卡而是Loopback:lo0,如圖所示:服務器
如下是我模擬client和server的代碼:網絡
1)server端併發
-Python 代碼 01 #! /usr/bin/python 02 # -*- coding: utf-8 -*- 03 04 import socket 05 06 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 07 08 server_address = ('127.0.0.1', 12345) 09 print "Starting up on %s:%s" % server_address 10 sock.bind(server_address) 11 12 sock.listen(1) 13 14 while True: 15 print "Waiting for a connection" 16 connection, client_address = sock.accept() 17 18 try: 19 print "Connection from", client_address 20 21 data = connection.recv(1024) 22 print "Receive '%s'" % data 23 finally: 24 connection.close()
2)client端-Python 代碼socket
01 # /usr/bin/python 02 # -*- coding: utf-8 -*- 03 04 import socket 05 06 def check_tcp_status(ip, port): 07 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 08 09 server_address = (ip, port) 10 print 'Connecting to %s:%s.' % server_address 11 sock.connect(server_address) 12 13 message = "I'm TCP client" 14 print 'Sending "%s".' % message 15 sock.sendall(message) 16 17 print 'Closing socket.' 18 sock.close() 19 20 21 if __name__ == "__main__": 22 print check_tcp_status("127.0.0.1", 12345)
代碼比較簡單,就是模擬了一次連接,能夠屢次執行client,client只要連接成功就會發送一句話「I'm TCP client」,server一直死循環監聽端口,並將接受到的信息打印到console中。tcp
看到上面的console輸出以後,咱們看一下wireshark抓到的結果:工具
我用兩種顏色標了出來,能夠看到黃色框中的序號爲一、二、3的三次通訊過程其實就是咱們說的三次握手;握手創建以後的序號爲四、五、6便爲傳輸數據的過程;而序號七、八、九、10就是咱們所說的四次揮手的過程。oop
咱們再進一步細看下握手、揮手這倆過程。google
三次握手
咱們來總結一下握手的規律:
四次揮手
接着總結下揮手的規律:
注意個規律: 每次一方返回ACK報文的時候,設置Ack=對方傳來的Seq值+1。
說完TCP協議以後,不能免俗的要聊一下TCP/IP協議模型,該模型是計算機網絡的經典的模型了。該模型由OSI模型演化而來,由原來的7層簡化爲了5層,具體以下圖所示:
TCP/IP協議被稱爲傳輸控制協議/互聯網協議,又稱網絡通信協議(Transmission Control Protocol)。是由網絡層的IP協議和傳輸層的TCP協議組成,是一個很大的協議集合。
TCP/IP的網絡模型分層思想算是很是有借鑑性的系統分層思想。映射到咱們的軟件系統上來看,其實咱們的軟件系統更多的時候也須要考慮分層,層次之間經過接口來交互。在嚴格的分層系統裏,內部的層只對相鄰的層次可見,這樣就能夠將一個複雜問題分解成增量步驟序列。因爲每一層最多隻影響兩層,也給維護帶來了很大的便利。
參考資料:
http://www.cnblogs.com/linyfeng/p/9496126.html
http://zhuanlan.zhihu.com/p/33797520