python下socket编程之TCP连接状态

1. 引言

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

2. 什么是TCP协议

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

主要的适用场景:

n 适合于对传输质量要求较高,以及传输大量数据的通信。

n 在需要可靠数据传输的场合,通常使用TCP协议。

n HTTP/HTTPS等即网络服务都采用TCP协议。

 

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

扫描二维码关注公众号,回复: 3983309 查看本文章

3. 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()

4. 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()

5. TCP的连接状态

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

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

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

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

6. 三次握手的状态分析

第一次握手:客户端首先将标志位SYN置为1,然后随机产生一个值seq=X的包,并将该数据包发送给server端,Client进入SYN_SENT状态,等待server确认。

第二次握手:server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack numbern=X+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

第三次握手:Client收到确认后,检查ack number是否为X+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

   感谢源码时代教学讲师提供此文章!   本文为原创文章,转载请注明出处!

 

猜你喜欢

转载自blog.csdn.net/villainy13579/article/details/81779548