TCP:TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,由IETF的RFC 793定義。
聊到網路協議,我們常常會想到OSI(Open System Interconnection 開放式系統互聯)七層模型、TCP/IP協議簇,她位於OSI、TCP/IP協議簇哪一層等問題。
如下圖OSI七層模型及對應的TCP/IP協議簇所示,TCP位於OSI中的第四層(傳輸層)。位於TCP/IP協議簇中的第四層(TCP or UDP)。
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 03:13:28)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license()"for more information.
>>> from socketserver import BaseRequestHandler, TCPServer
>>> class EchoHandler(BaseRequestHandler):
def handle(self):
print('Got connection from', self.client_address)
while True:
msg = self.request.recv(8192)
if not msg:
break
self.request.send(msg)
>>> if __name__ == '__main__':
serv = TCPServer(('', 20000), EchoHandler)
serv.serve_forever()
Got connection from ('127.0.0.1', 59006)
複製程式碼
客戶端程式碼:
wangyongwangdeiMac:~ wangyongwang$ python
Python 2.7.15 (default, Oct 2 2018, 11:47:18)
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.2)] on darwin
Type "help", "copyright", "credits" or "license"for more information.
>>> from socket import socket, AF_INET, SOCK_STREAM
>>> s = socket(AF_INET, SOCK_STREAM)
>>> s.connect(('localhost', 20000))
複製程式碼
上述程式碼的效果如下圖所示:
如上圖,Got connection from ('127.0.0.1', 62515)我們可以確定客戶端使用的埠是59006。
通過上述準備工作,下邊筆者會使用Wireshark捕獲TCP請求響應的整個過程,並進行相應分析。
TCP三次握手
TCP通過三次握手建立連線,我們對下圖應該比較熟悉:
對上圖中的代號及下文中的代號做說明:
Seq即下文中的Sequence number ,序列號是指傳送資料的位置。每傳送一次資料,就累加一次該資料位元組數的大小。一般用Wireshark捕獲我們平時的請求的Seq是一個隨機數。
Ack 即Acknowledgement number,是指下一次應該受到的資料的序列號。
SYN為Flags部分的Syn,Syn為1表示希望建立連線。
ACK為Flags部分的ACK,Ack為1表示確認應答的欄位變為有效。
TCP第一次握手,客戶端向服務端傳送報文,關鍵資訊為Syn=1,Seq=0。如下圖所示,sequence number= x = 0,Syn=1。
TCP第二次握手,服務端向客戶端傳送報文,關鍵資訊為Ack=x+1=1,Syn=1,Seq=y=0。如下圖所示,sequence number=y=0,Ack=x+1=1 , Syn = 1。
從源埠20000,目的埠53262可以看出下圖表示服務端向客戶端反饋收到了訊息。Acknowledgement number 為4是因為,服務端接接收了客戶端的2個位元組的資料,在之前的客戶端的Sequence number的基礎上加了2。
從源埠20000,目的埠53262可以看出,下圖表示服務端向客戶端傳送訊息,傳送的資料為'AB','AB'的ASCII碼為0x4142。
從源埠53262,目的埠20000可以看出下圖表示客戶端向服務端反饋收到了訊息。Acknowledgement number 為4是因為,客戶端接收了服務端的2個位元組的資料,在之前的服務端的Sequence number的基礎上加了2。