Python TCP 协议网络编程《一》

TCP协议介绍

  • TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)

  • TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。

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

  • TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话",而UDP类似于生活中的"发短信"。

 

TCP三次握手

  1. 首先Client(客户)端发送连接请求报文(第一次握手)。

  2. Server(服务器)端接受连接后回复ACK报文(第二次握手),并为这次连接分配资源。

  3. Client端接收到ACK报文后也向Server段发生ACK报文(第三次握手),并分配资源,这样TCP连接就建立了。

 

详细三次握手过程如下:
第一次握手:起初两端都处于CLOSED关闭状态,Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN-SENT状态,等待Server确认;

 

第二次握手:Server收到数据包后由标志位SYN=1得知Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN-RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量;

 

第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server就可以开始传输数据。

 

TCP四次挥手

客户端主动发起请求,服务端被动关闭。
首先是client向server发起断开连接请求,server响应client等会儿断开,server响应client可以断开了,client告知server已经断开链接。

 

详细过程如下:
第一次挥手:起初client和server处于ESTABLISHED状态——client发出连接释放报文段并处于FIN-WAIT-1状态

第二次挥手:server发出确认报文段且进入CLOSE-WAIT状态——A收到确认后。

第三次挥手:client进入FIN-WAIT-2状态,等待server的连接释放报文段。

第四次挥手:server没有要向client发出的数据,server就发出连接释放报文段且进入LAST-ACK状态——client发出确认报文段且进入TIME-WAIT状态——server收到确认报文段后进入CLOSED状态——client经过等待计时器时间2MSL后,进入CLOSED状态。

 

TCP服务端创建流程

  • socket创建一个套接字

  • bind绑定ip和port

  • listen使套接字变为可以被动链接

  • accept等待客户端的链接

  • recv/send接收发送数据

     1server.py文件内容如下:
     2
     3from socket import socket,SOCK_STREAM,AF_INET #导入模块
     4def tcp_server():
     5    tcp_server_socket=socket(AF_INET,SOCK_STREAM) #创建TCP服务端套接字对接,UDP是SOCK_DGRAM
     6    server_address=('127.0.0.1',8888)#定义本TCP服务端的ip and port
     7    tcp_server_socket.bind(server_address) #绑定本机的8888端口
     8    tcp_server_socket.listen() #执行监听
     9    client_socket,client_info = tcp_server_socket.accept() #接收客户端的socker and info
    10    data=client_socket.recv(1024)#接收客户端发过来的消息
    11    print("the data is:%s, it's from %s",(client_info,data.decode("utf-8")))#打印客户端的消息
    12    client_socket.close()#关闭客户端的连接
    13    tcp_server_socket.close()#关闭服务端的连接
    14
    15if __name__ == '__main__':
    16    print("the TCP server is running ...")
    17    tcp_server()
    18
    19
    20
    21client.py文件内容如下:
    22from socket import socket,SOCK_STREAM,AF_INET #导入模块
    23def tcp_client():
    24    tcp_client_socket=socket(AF_INET,SOCK_STREAM) #创建TCP客户端套接字对接
    25    server_address=('127.0.0.1',8888)#定义本TCP服务端的ip and port
    26    tcp_client_socket.connect(server_address) #连接到服务端
    27    message="hello my name is tony" #定义要发送的消息
    28    tcp_client_socket.send(message.encode("utf-8"))#向服务端发送消息
    29    tcp_client_socket.close()#关闭客户端的连接
    30
    31
    32if __name__ == '__main__':
    33    print("the TCP client is running ...")
    34    tcp_client()
    35    print("the message was send")

    输出内容为:

    1#server.py文件输出内容如下:
    2the TCP server is running ...
    3the data is:%s, it's from %s (('127.0.0.1', 50929), 'hello my name is tony')
    4
    5
    6#client.py文件输出内容如下:
    7the TCP client is running ...
    8the message was send

    欢迎关注【无量测试之道】公众号,回复【领取资源】,
    Python编程学习资源干货、
    Python+Appium框架APP的UI自动化、
    Python+Selenium框架Web的UI自动化、
    Python+Unittest框架API自动化、

    资源和代码 免费送啦~
    文章下方有公众号二维码,可直接微信扫一扫关注即可。

    备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

     添加关注,让我们一起共同成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu_Candy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值