Python 绝技 —— TCP 服务器与客户端
? 0x00 前言 本文先介绍因特网的核心协议 TCP ,再以 Python 的 socket 模块为例介绍网络套接字,最后给出 TCP 服务器与客户端的 Python 脚本,并演示两者之间的通信过程。 0x01 TCP 协议 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接、可靠的、基于字节流的传输层通信协议。 TCP 协议的执行过程分为连接创建(Connection Establishment)、数据传送(Data Transfer)和连接终止(Connection Termination)三个阶段,其中「连接创建」与「连接终止」分别是耳熟能详的 TCP 协议三次握手(TCP Three-way Handshake)与四次挥手(TCP Four-way Handshake),也是理解本文 TCP 服务器与客户端通信过程的两个核心阶段。 为了能更好地理解下述过程,对 TCP 协议头的关键区段做以下几点说明:
连接创建 所谓的「三次握手」,即 TCP 服务器与客户端成功建立通信连接必经的三个步骤,共需通过三个报文完成。 一般而言,首先发送 SYN 报文的一方是客户端,服务器则是监听来自客户端的建立连接请求。 Handshake Step 1 客户端向服务器发送 SYN 报文(SYN=1)请求建立连接。 此时报文的初始序列号为 seq = x ,确认号为ack = 0,发送完毕后,客户端进入 SYN_SENT 状态。 Handshake Step 2 服务器接收到客户端的 SYN 报文后,发送 ACK + SYN 报文(ACK=1,SYN=1)确认客户端的建立连接请求,并也向其发起建立连接请求。 此时报文的序列号为 seq = y,确认号为 ack = x+1,发送完毕后,服务器进入 SYN_RCVD状态。 Handshake Step 3 客户端接收到服务器的 SYN 报文后,发送 ACK 报文(ACK=1)确认服务器的建立连接请求。 此时报文的序列号为 seq=x+1,确认号为 ack=y+1。发送完毕后,客户端进入 ESTABLISHED 状态;当服务器接收该报文后,也进入了 ESTABLISHED 状态。 至此,「三次握手」过程全部结束,TCP 通信连接成功建立。 读者可参照以下「三次握手」的示意图进行理解: 连接终止(Connection Termination) 所谓的「四次挥手」,即 TCP 服务器与客户端完全终止通信连接必经的四个步骤,共需通过四个报文完成。 由于 TCP 通信连接是全双工的,因此每个方向的连接可以单独关闭,即可视为一对「二次挥手」,或一对单工连接。主动先发送 FIN 报文的一方,意味着想要关闭到另一方的通信连接,即在此方向上不再传输数据,但仍可以接收来自另一方传输过来的数据,直到另一方也发送 FIN 报文,双方的通信连接才完全终止。 注意,首先发送 FIN 报文的一方,既可以是客户端,也可以是服务器。下面以客户端先发起关闭请求为例,对「四次挥手」的过程进行讲解。 Handshake Step 1 当客户端不再向服务器传输数据时,则向其发送 FIN 报文(FIN=1)请求关闭连接。 此时报文的初始序列号为 seq = u ,确认号为ack = 0,(若此报文中 ACK=1,则 ACK 的值与客户端的前序接收报文有关)。发送完毕后,客户端进入 FIN_WAIT_1 状态。 Handshake Step 2 服务器接收到客户端的 FIN 报文后,发送 ACK 报文(ACK = 1)确认客户端的关闭连接请求。 此时报文的序列号为 seq = v, 确认号为ack = u + 1,发送完毕后,服务器进入 CLOSE_WAIT 状态;当客户端接收该报文后,进入 FIN_WAIT_2 状态。 注意,此时 TCP 通信连接处于半关闭状态,即客户端不再向服务器传输数据,但仍可以接收服务器传输过来的数据。 Handshake Step 3 当服务器不再向客户端传输数据时,则向其发送 FIN + ACK 报文(FIN=1,ACK=1)请求关闭连接。 此时报文的序列号为 seq = w(若在半关闭状态,服务器没有向客户端传输过数据,则 seq = v+1 ),确认号为 ack = u+1。发送完毕后,服务器进入 LAST_ACK 状态。 Handshake Step 4 客户端接收到服务器的 FIN + ACK 报文后,发送 ACK 报文(ACK = 1)确认服务器的关闭连接请求。 此时报文的序列号为 seq=u+1,确认号为 ack=w+1。发送完毕后,客户端进入 TIME_WAIT 状态;当服务器接收该报文后,进入 CLOSED 状态;当客户端等待了 2MSL 后,仍没接到服务器的响应,则认为服务器已正常关闭,自己也进入 CLOSED 状态。 至此,「四次挥手」过程全部结束,TCP 通信连接成功关闭。 读者可参照以下「四次挥手」的示意图进行理解: 0x02 Network Socket Network Socket(网络套接字)是计算机网络中进程间通信的数据流端点,广义上也代表操作系统提供的一种进程间通信机制。 进程间通信(Inter-Process Communication,IPC)的根本前提是能够唯一标示每个进程。在本地主机的进程间通信中,可以用 PID(进程 ID)唯一标示每个进程,但 PID 只在本地唯一,在网络中不同主机的 PID 则可能发生冲突,因此采用「IP 地址 + 传输层协议 + 端口号」的方式唯一标示网络中的一个进程。 【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。 |
-
服务网格(Service Mesh)为服务通信带来了安全性、弹性...[详细]
-
当大多数人谈论无服务器架构时,首先想到的是基于云的...[详细]
-
1.什么是负载均衡 负载均衡,英文 名称为Load Balance...[详细]
-
3月份,IDC先后出炉了 2018年Q4企业存储和服务器的市...[详细]
-
大家好,本文我想分享一下我的经验,如果你的Tomcat应...[详细]
-
天下大势,合久必分,分久必合。这一定律放在IC的时间...[详细]
-
服务器部署前端Node 项目(包括阿里云服务器、nginx 以及 mongoDB
服务器购买配置 打开阿里云,选择购买云服务器 ECS,...[详细]
-
说起服务器运维,小编谈不上是老手,因为小编应用 VPS...[详细]
-
想必大家一定听说过Nginx,若没听说过它?那么一定听过...[详细]
-
一图速看,精彩不错过!带你走近2018 OpenPOWER中国高峰论坛
【51CTO.com原创稿件】作为OpenPOWER基金会的年度成果...[详细]