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次握手结束。
相关文章推荐
- TCP连接建立与关闭
- libjingle源码解析(3)-【PseudoTcp】建立UDP之上的TCP(1):连接和关闭
- 【通信】TCP建立连接协议是三次握手,而关闭连接却是四次握手
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接建立和关闭中的疑难点
- TCP建立连接的三次握手和关闭连接的四次握手
- TCP三次握手(建立连接)/四次挥手(关闭连接)
- TCP 建立连接的三次握手,TCP关闭连接的四次握手!!!面试官就那点事
- TCP三次握手(建立连接)/四次挥手(关闭连接)详解带图
- TCP连接建立与关闭
- TCP连接的建立和关闭
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP/IP的三次握手连接和四次握手关闭【问题:为什么建立连接协议是三次握手,而关闭连接却是四次握手?】
- TCP建立和关闭连接
- 用tcpdump 分析如何建立与关闭tcp连接
- 话说,那是一次完整的连接建立过程【C/S, tcp三次握手,发包,关闭连接】
- TCP连接建立与关闭
- 为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?