偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

網(wǎng)絡(luò)通信協(xié)議之TCP

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
在本篇文章,筆者將給大家介紹下TCP建立連接(三次握手),傳輸數(shù)據(jù),斷開連接(四次揮手)的過程。

部分非常容易能夠創(chuàng)建一個(gè)本地TCP服務(wù)器,正好可以用來分析一下TCP的請求和響應(yīng)過程。

在本篇文章,筆者將給大家介紹下TCP建立連接(三次握手),傳輸數(shù)據(jù),斷開連接(四次揮手)的過程。

網(wǎng)絡(luò)協(xié)議

TCP簡介

TCP:TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793定義。

聊到網(wǎng)絡(luò)協(xié)議,我們常常會(huì)想到OSI(Open System Interconnection 開放式系統(tǒng)互聯(lián))七層模型、TCP/IP協(xié)議簇,她位于OSI、TCP/IP協(xié)議簇哪一層等問題。

如下圖OSI七層模型及對應(yīng)的TCP/IP協(xié)議簇所示,TCP位于OSI中的第四層(傳輸層)。位于TCP/IP協(xié)議簇中的第四層(TCP or UDP)。

下圖為OSI七層模型及對應(yīng)的TCP/IP協(xié)議簇

OSI TCP/IP Family

OSI TCP/IP Family

TCP是面向連接的,是指客戶端在發(fā)送、接收數(shù)據(jù)之前需要先建立連接,這個(gè)連接過程需要三次握手來完成,筆者借助Python搭建了一個(gè)本地的TCP服務(wù),并使用Wireshark(Wireshark(前稱Ethereal)是一個(gè)網(wǎng)絡(luò)封包分析軟件。網(wǎng)絡(luò)封包分析軟件的功能是擷取網(wǎng)絡(luò)封包,并盡可能顯示出最為詳細(xì)的網(wǎng)絡(luò)封包資料。)

捕獲了本地的TCP服務(wù)器和TCP客戶端之間請求響應(yīng)的過程,帶大家一起看一下建立連接(三次握手),傳輸數(shù)據(jù),斷開連接(四次揮手)的過程。

本地搭建TCP服務(wù)準(zhǔn)備工作

筆者在前文提到了要用Python創(chuàng)建一個(gè)本地TCP服務(wù)器,并且分析TCP的請求響應(yīng)過程。這里筆者使用的是PythonIDE、Mac自帶的終端簡單創(chuàng)建了一個(gè)本地TCP服務(wù)端和客戶端。

筆者會(huì)分析的過程如下:

  • 創(chuàng)建并且啟動(dòng)一個(gè)端口號為20000的TCP服務(wù)端
  • 創(chuàng)建客戶端并和服務(wù)端建立連接(三次握手)
  • 客戶端向服務(wù)端發(fā)送數(shù)據(jù)'AB'
  • 服務(wù)端到數(shù)據(jù)后給客戶端發(fā)送數(shù)據(jù)'AB'
  • 服務(wù)端收到數(shù)據(jù)向客戶端發(fā)送收到的數(shù)據(jù)(當(dāng)前即'AB')
  • 客戶端和服務(wù)端斷開連接(四次揮手)
  • 使用Wireshark對建立連接(三次握手),傳輸數(shù)據(jù),斷開連接(四次揮手)的過程進(jìn)行分析

服務(wù)端代碼:

  1. Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 03:13:28)   
  2. [Clang 6.0 (clang-600.0.57)] on darwin  
  3. Type "help", "copyright", "credits" or "license()" for more information.  
  4. >>> from socketserver import BaseRequestHandler, TCPServer  
  5. >>> class EchoHandler(BaseRequestHandler):  
  6. def handle(self):  
  7. print('Got connection from', self.client_address)  
  8. while True:  
  9. msg = self.request.recv(8192)  
  10. if not msg:  
  11. break  
  12. self.request.send(msg)  
  13.  
  14.      
  15. >>> if __name__ == '__main__':  
  16. serv = TCPServer(('', 20000), EchoHandler)  
  17. serv.serve_forever() 
  18.  
  19.       
  20. Got connection from ('127.0.0.1', 59006) 

客戶端代碼:

  1. wangyongwangdeiMac:~ wangyongwang$ python  
  2. Python 2.7.15 (default, Oct 2 2018, 11:47:18)  
  3. [GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.2)] on darwin 
  4. Type "help", "copyright", "credits" or "license" for more information.  
  5. >>> from socket import socket, AF_INET, SOCK_STREAM  
  6. >>> s = socket(AF_INET, SOCK_STREAM)  
  7. >>> s.connect(('localhost', 20000)) 

上述代碼的效果如下圖所示:

TCP請求響應(yīng)效果圖

TCP請求響應(yīng)效果圖

TCP建立連接效果圖

TCP建立連接效果圖

如上圖,Got connection from ('127.0.0.1', 62515)我們可以確定客戶端使用的端口是59006。

通過上述準(zhǔn)備工作,下邊筆者會(huì)使用Wireshark捕獲TCP請求響應(yīng)的整個(gè)過程,并進(jìn)行相應(yīng)分析。

TCP三次握手

TCP通過三次握手建立連接,我們對下圖應(yīng)該比較熟悉:

TCP三次握手圖解

TCP三次握手圖解

對上圖中的代號及下文中的代號做說明:

  • Seq即下文中的Sequence number ,序列號是指發(fā)送數(shù)據(jù)的位置。每發(fā)送一次數(shù)據(jù),就累加一次該數(shù)據(jù)字節(jié)數(shù)的大小。一般用Wireshark捕獲我們平時(shí)的請求的Seq是一個(gè)隨機(jī)數(shù)。
  • Ack 即Acknowledgement number,是指下一次應(yīng)該受到的數(shù)據(jù)的序列號。
  • SYN為Flags部分的Syn,Syn為1表示希望建立連接。
  • ACK為Flags部分的ACK,Ack為1表示確認(rèn)應(yīng)答的字段變?yōu)橛行А?/li>

TCP***次握手,客戶端向服務(wù)端發(fā)送報(bào)文,關(guān)鍵信息為Syn=1,Seq=0。如下圖所示,sequence number= x = 0,Syn=1。

TCP***次握手

TCP***次握手

TCP第二次握手,服務(wù)端向客戶端發(fā)送報(bào)文,關(guān)鍵信息為Ack=x+1=1,Syn=1,Seq=y=0。如下圖所示,sequence number=y=0,Ack=x+1=1 , Syn = 1。

TCP第二次握手

TCP第二次握手

TCP第三次握手,客戶端向服務(wù)端發(fā)送報(bào)文,Seq=x+1=1,Ack=y+1=1,ACK=1。如下圖所示,Seq=x+1=1,Ack=y+1=1,ACK=1。

TCP第三次握手

TCP第三次握手

我們可以發(fā)現(xiàn)在三次握手之后,還有一次TCP Window Update。

TCP Window Update

TCP Window Update

TCP Window Update 是TCP通信中的一個(gè)狀態(tài),它可以發(fā)生的原因有很多,但最終歸結(jié)于發(fā)送者傳輸數(shù)據(jù)的速度比接收者讀取的數(shù)據(jù)還快,這使得接受端的在緩沖區(qū)必須釋放一部分空間來裝發(fā)送過來的數(shù)據(jù),然后向發(fā)送者發(fā)送Windows Update,告訴給發(fā)送者應(yīng)該以多大的速度發(fā)送數(shù)據(jù),從而使得數(shù)據(jù)傳輸與接受恢復(fù)正常。參考:tcp三次握手

從上圖TCP Window Update,根據(jù)Source Port:20000及Destination Port:59006可知,當(dāng)前發(fā)送者是客戶端,解釋下上一段文字的意思是,客戶端發(fā)送的數(shù)據(jù)太快,服務(wù)端讀書數(shù)據(jù)慢,服務(wù)端向客戶端發(fā)送了一個(gè)TCP Window Update的報(bào)文。

上述內(nèi)容就是TCP建立連接的過程,下邊筆者給大家介紹下傳輸數(shù)據(jù)部分的內(nèi)容:

TCP的數(shù)據(jù)傳輸過程

查看數(shù)據(jù)傳輸過程和之前建立連接部分,用的是下圖代碼進(jìn)行的分析:

TCP的數(shù)據(jù)傳輸過程

代碼內(nèi)容和之前建立連接的代碼一樣,只是添加了發(fā)送數(shù)據(jù)和斷開連接的幾行代碼??梢娺@次客戶端分配的端口號為53262。

在分析數(shù)據(jù)傳輸過程之前,筆者先對下邊會(huì)用到的名詞及工具做個(gè)簡單說明:

  • 字節(jié)即byte,比特即bit,1個(gè)字節(jié)(byte)=8個(gè)比特(bit)。
  • ASCII碼:是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)

ASCII碼對照表:

舉個(gè)例子'A'的ASCII碼為0x41

基本的16進(jìn)制、2進(jìn)制、10進(jìn)制之間的轉(zhuǎn)換:16進(jìn)制0x41對應(yīng)2進(jìn)制為 0100 0001對應(yīng)10進(jìn)制為4 * 16 + 1 = 65

在線進(jìn)制轉(zhuǎn)換:

下邊筆者帶大家看一下數(shù)據(jù)傳輸部分的分析:

下圖表示客戶端s.send(b'A')以二進(jìn)制形式傳輸'A'(其對應(yīng)的ASCII碼為65)傳輸過程:

客戶端到服務(wù)端

下邊展示一個(gè)客戶端s.send(b'AB')并且服務(wù)端給予相應(yīng)的回應(yīng)(服務(wù)端也給客戶端發(fā)送收到的'')的過程:

  • 接收數(shù)據(jù)的部分Flags中的Acknowledgement 設(shè)置為1,表示確認(rèn)應(yīng)答的字段有效
  • 接收數(shù)據(jù)的部分Flags中的Push 設(shè)置為1表示表示接收方應(yīng)該盡快把數(shù)據(jù)傳給上層應(yīng)用協(xié)議

從源端口53262,目的端口20000可以看出,下圖表示客戶端向服務(wù)端發(fā)送消息,發(fā)送的數(shù)據(jù)為'AB','AB'的ASCII碼為0x4142。

客戶端向服務(wù)端發(fā)送消息

客戶端向服務(wù)端發(fā)送消息

從源端口20000,目的端口53262可以看出下圖表示服務(wù)端向客戶端反饋收到了消息。

Acknowledgement number 為4是因?yàn)?,服?wù)端接接收了客戶端的2個(gè)字節(jié)的數(shù)據(jù),在之前的客戶端的Sequence number的基礎(chǔ)上加了2。

服務(wù)端到客戶端收到消息響應(yīng)

服務(wù)端到客戶端收到消息響應(yīng)

從源端口20000,目的端口53262可以看出,下圖表示服務(wù)端向客戶端發(fā)送消息,發(fā)送的數(shù)據(jù)為'AB','AB'的ASCII碼為0x4142。

服務(wù)端給客戶端發(fā)送消息

服務(wù)端給客戶端發(fā)送消息

從源端口53262,目的端口20000可以看出下圖表示客戶端向服務(wù)端反饋收到了消息。Acknowledgement number 為4是因?yàn)?,客戶端接收了服?wù)端的2個(gè)字節(jié)的數(shù)據(jù),在之前的服務(wù)端的Sequence number的基礎(chǔ)上加了2。

客戶端收到服務(wù)端消息后的響應(yīng)

客戶端收到服務(wù)端消息后的響應(yīng)

TCP斷開連接四次揮手

TCP斷開連接示意圖如下:

TCP斷開連接示意圖

TCP斷開連接示意圖

對應(yīng)的Python的客戶端代碼s.shutdown(2),客戶端主動(dòng)斷開連接的。

  • 斷開連接的Flags中Fin是設(shè)置為1的,表示希望斷開連接。
  • 斷開連接的Flags中Ack是設(shè)置為1的,表示確認(rèn)應(yīng)答字段有效。

響應(yīng)的Wireshark抓包分析如下:

TCP斷開連接***次揮手,從源端口53262到目的端口20000,可以看出是客戶端主動(dòng)斷開連接的。Flags中的Fin是設(shè)置為1的,Sequence number為7。

TCP斷開連接***次揮手

TCP斷開連接***次揮手

TCP斷開連接第二次揮手,從源端口20000到目的端口53262,可以看出是服務(wù)端給予客戶端斷開連接的響應(yīng)。并且Acknowledge number對之前的客戶端的Sequence number做了加1操作。

TCP斷開連接第二次揮手

TCP斷開連接第二次揮手

TCP斷開連接第三次揮手,從源端口20000到目的端口53262,F(xiàn)lags中的Fin是設(shè)置為1的,可以看出是服務(wù)端向客戶端發(fā)送斷開連接的。Sequence number為7。

TCP斷開連接第三次揮手

TCP斷開連接第三次揮手

TCP斷開連接第四次揮手,從源端口53262到目的端口20000,可以看出是客戶端給予服務(wù)端斷開連接的響應(yīng)。并且Acknowledge number對之前的服務(wù)端的Sequence number做了加1操作。

TCP斷開連接第四次揮手

TCP斷開連接第四次揮手

下邊,筆者貼出了IP和TCP首部及Wireshark捕獲TCP請求過程的的圖。有興趣的讀者可自行做簡單分析。

TCP數(shù)據(jù)在IP數(shù)據(jù)報(bào)中的封裝及TCP包首部

TCP數(shù)據(jù)在IP數(shù)據(jù)報(bào)中的封裝及TCP包首部

后來和昆哥一起交流,經(jīng)過昆哥指正,上圖的TCP首部已經(jīng)更新過了,較新的TCP首部格式如下:

TCP首部

TCP首部

下圖為TCP首部中的控制位部分:

控制位 Control Flag

TCP

TCP

【本文是51CTO專欄機(jī)構(gòu)360技術(shù)的原創(chuàng)文章,微信公眾號“360技術(shù)( id: qihoo_tech)”】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2024-02-20 19:53:57

網(wǎng)絡(luò)通信協(xié)議

2010-06-09 11:31:55

網(wǎng)絡(luò)通信協(xié)議

2010-06-14 19:13:28

網(wǎng)絡(luò)通信協(xié)議

2021-08-13 11:27:25

網(wǎng)絡(luò)通信數(shù)據(jù)

2010-06-09 11:57:42

網(wǎng)絡(luò)通信協(xié)議

2010-07-01 15:45:22

網(wǎng)絡(luò)通信協(xié)議

2021-03-04 09:50:23

Redis網(wǎng)絡(luò)通信Redis服務(wù)器

2010-06-09 12:20:34

網(wǎng)絡(luò)通信協(xié)議層

2024-04-26 09:13:34

RPCHTTP協(xié)議

2010-06-12 16:34:57

網(wǎng)絡(luò)通信協(xié)議

2010-06-12 16:51:54

計(jì)算機(jī)網(wǎng)絡(luò)通信協(xié)議

2019-09-02 10:20:27

TCPIP協(xié)議

2010-06-12 15:54:09

TCP IP協(xié)議

2023-11-04 09:06:11

2009-08-24 17:20:13

C#網(wǎng)絡(luò)通信TCP連接

2023-10-12 19:37:50

通信協(xié)議HTTP

2019-10-17 11:06:32

TCP粘包通信協(xié)議

2010-06-12 15:41:29

TCP IP通信協(xié)議

2010-06-11 14:31:08

通信協(xié)議

2022-12-02 14:42:37

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號