您的位置:首页 > 理论基础 > 计算机网络

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

2017-04-27 15:09 197 查看

一、三次握手与四次挥手

建立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 = 12000
serverSocket = 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)

4000
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 = 12000
clientSocket = 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:',modiferSentence
clientSocket.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次握手结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: