028-86261949

当前位置:首页 > 技术交流 > Linux下TCP连接状态

Linux下TCP连接状态

2019/03/20 11:22 分类: 技术交流 浏览:24

python作为一门胶水语言,可以在各个领域上作为快速开发的工具,大大提高开发者处理事务的效率。在互联网行业中,不管是对网络服务器的开发,还是对网络客户端,例如爬虫的开发中,都会涉及到底层的运行原理,那就是socket编程,那么今天,我们将对python下的socket编程开发中,TCP协议中连接状态做一个介绍,通过本篇文章,可以让大家对网络编程中底层的TCP协议的连接有一定的认识。

  1. 什么是TCP协议

TCP协议,传输控制协议(Transmission Control Protocol,缩写为TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信):

主要的适用场景:

  • 适合于对传输质量要求较高,以及传输大量数据的通信。
  • 在需要可靠数据传输的场合,通常使用TCP协议。
  • HTTP/HTTPS等即网络服务都采用TCP协议。

TCP通信需要经过创建连接、数据传送、终止连接三个步骤。

  1. TCP服务器编程

在python中,提供了一个socket模块,他里面封装了系统底层socket接口的python格式API,对于Python开发者来说,只需要导入该模块就可以实现socket编程了。

from socket import *

 

# 创建socket

tcpSerSocket = socket(AF_INET, SOCK_STREAM)

# 绑定本地信息

address = ('', 7788)

tcpSerSocket.bind(address)

# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了

tcpSerSocket.listen(5)

 

# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务器

# newSocket用来为这个客户端服务

# tcpSerSocket就可以省下来专门等待其他新客户端的链接

newSocket, clientAddr = tcpSerSocket.accept()

 

# 接收对方发送过来的数据,最大接收1024个字节

recvData = newSocket.recv(1024)

print '接收到的数据为:',recvData

 

# 发送一些数据到客户端

newSocket.send("thank you !")

 

# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接

newSocket.close()

 

# 关闭监听套接字,只要这个套接字关闭了,就意味着整个程序不能再接收任何新的客户端的连接

tcpSerSocket.close()

  1. TCP客户端

TCP客户端的核心接口API是connect,由于TCP要求的是稳定传输,所以在后面数据传输前,需要借助三次握手的协议特点去实现连接。而connect函数则是三次握手协议的发起者。

from socket import *

 

# 创建socket

tcpClientSocket = socket(AF_INET, SOCK_STREAM)

 

# 链接服务器

serAddr = ('192.168.1.102', 7788)

tcpClientSocket.connect(serAddr)

 

# 提示用户输入数据

sendData = input("请输入要发送的数据:")

 

tcpClientSocket.send(sendData)

 

# 接收对方发送过来的数据,最大接收1024个字节

recvData = tcpClientSocket.recv(1024)

print '接收到的数据为:',recvData

 

# 关闭套接字

tcpClientSocket.close()

  1. TCP的连接状态

我们可以把刚刚的2个程序,放到2台虚拟机上,或者一台虚拟机,一台物理机上,然后使用wireshark抓包工具来对其通信过程进行数据包底层状态的分析。

可以看到图上,前3个包就是3次握手的结构。

中间2个包,是我们发送数据,服务器接收数据的包。

最后4个包,是连接断开后,进行的4次挥手的结构。

  1. 三次握手的状态分析
  1. 第一次握手:客户端首先将标志位SYN置为1,然后随机产生一个值seq=X的包,并将该数据包发送给server端,Client进入SYN_SENT状态,等待server确认。
  2. 第二次握手:server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack numbern=X+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  3. 第三次握手:Client收到确认后,检查ack number是否为X+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

 

#标签:Linux下TCP连接状态