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次握手结束。
- TCP连接建立与关闭数据包捕获
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接建立与关闭
- TCP连接的建立与关闭
- TCP连接的建立与关闭
- TCP连接的建立与关闭
- TCP连接建立、关闭
- TCP建立和关闭连接
- Ext学习(三)Ext.util包下相关类
- 通过MCU实现Altera FPGA在线升级
- Android 监听手机GPS打开状态
- Android 5.1实现休眠的方法
- Visual Studio 2005调试ASP脚本程序的方法--
- TCP连接建立与关闭数据包捕获
- Java进阶(十五)Java中设置session的详细解释
- 创业公司体会
- 题目1467:二叉排序树
- nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
- Linux Shell 之 对文件中的行、单词、字符进行迭代
- border与三角等图形构建
- solr简单介绍
- 分布式数据存储-MySQL主从复制