TCP连接建立与关闭数据包捕获

来源:互联网 发布:天界宠物升品数据 编辑:程序博客网 时间:2024/05/20 00:16

一、三次握手与四次挥手

建立TCP连接需要三次握手,断开连接则需要四次挥手,整个过程如下:
这里写图片描述

(一)连接建立阶段:
(1)客户端发送一个SYN包给服务器,然后等待应答。
(2)服务器端回应给客户端一个ACK=1、SYN=1的TCP数据段。
(3)客户必须再次回应服务器端一个ACK确认数据段。

(二)连接断开阶段:
(1) TCP客户端发送一个FIN,关闭客户端到服务器端的数据传送。(客户端不再发送报文给服务器端,但可接受服务器端报文)
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。(服务器端关闭到客户端的数据传送)
(4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1。

整个过程client端所经历的状态如下:
这里写图片描述

server端所经历的过程如下:
这里写图片描述

整个TCP状态转换图:
这里写图片描述

二、连接建立与断开过程数据包的捕获

本次是基于本地的两个服务端与客户端进程来进行wireshark抓包实验。
(一)代码如下:
服务器端TCPserver.py

from socket import *serverPort = 12000serverSocket = socket(AF_INET,SOCK_STREAM)serverSocket.bind(('',serverPort))serverSocket.listen(1)print 'The server is ready to receive.'while 1:    connectionSocket,addr = serverSocket.accept()    print 'already connect:',addr    sentence = connectionSocket.recv(1024)    print 'Get sentence from Client:',sentence    capitalizedSentence = sentence.upper()    print 'Sent modifedSentence to Client:',capitalizedSentence    connectionSocket.send(capitalizedSentence)connectionSocket.close()

客户端TCPclient.py

from socket import *serverName = '127.0.0.1'serverPort = 12000clientSocket = socket(AF_INET,SOCK_STREAM)clientSocket.connect((serverName,serverPort))print 'already connect server.'sentence = raw_input('Input lowercase sentence:')clientSocket.send(sentence)modiferSentence = clientSocket.recv(1024)print 'From Server:',modiferSentenceclientSocket.close()

可见,这是个客户端发送小写字符串给服务端,服务端将字符串转换为大写之后再发给客户端。
将服务端与客户端先后运行,并用wireshark进行抓包。

1.
这里写图片描述
因为是在本地测试的,所以从图中可见,客户端和服务端的ip地址都是127.0.0。但是端口是不一样的。因为是客户端发起TCP连接,所以可见客户端的端口号是58510,服务端的端口号是12000。
客户端发送一个TCP连接请求报文,SYN=1,Seq=0,客户端进入SYN_SENT状态。

2.
这里写图片描述
服务器端收到后发送SYN_ACK响应报文。SYN=1,Ack=1,Seq=0。服务端进入SYN_RCVD状态。

3.
这里写图片描述
客户端收到SYN_ACK响应报文后,发送ACK报文,ACK=1,Seq=1,Ack=1。客户端连接连接建立,进入ESTABLISHED状态。

4.服务端收到该报文后,进入ESTABLISHED状态。至此,TCP连接的三次握手完成。

5.
这里写图片描述
客户端紧接着发送报文,携带字符串”hello”。PSH标志表示客户端希望服务端收到报文后马上发响应报文。

6.
这里写图片描述
服务端发送响应报文。

7.
这里写图片描述
服务端紧接着发送报文,携带字符串是大写的“HELLO”。

8.
这里写图片描述
客户端收到后马上发送响应报文。

9.
这里写图片描述
服务端无数据需要发送了,发送FIN报文,表示将要关闭连接。服务端进入FIN_WAIT_1状态。

10.
这里写图片描述
客户端情收到后发送FIN_ACK报文。注意,其实这里是把两步合为一步了。本来是客户端先发送ACK报文,进入CLOSE_WAIT。服务端收到该ACK报文后进入FIN_WAIT_2状态。等客户端读写操作结束可以关闭连接时,才发送FIN报文,进入LAST_ACK状态。

11.
这里写图片描述
服务端收到FIN报文后,发送ACK报文,进入TIME_WAIT状态。

12.客户端收到ACK报文后,关闭连接。服务端在经过一个定时等待后,也关闭连接。至此,TCP连接关闭的4次握手结束。

0 0
原创粉丝点击