TCP协议通讯流程

文章目录:

通讯流程全过程浏览

下图是基于TCP协议的客户端/服务器程序的一般流程:

上图就是TCP协议的通信流程,接下来认识初步认识以下TCP建立连接(三次握手)和断开连接(四次挥手),以及建立连接和断开连接与各个网络接口之间的对应关系。

建立连接过程

服务器初始化包括以下步骤:

  • 调用 socket 函数创建一个文件描述符,用于后续的网络通信。
  • 调用 bind,将当前的文件描述符与指定的IP地址和端口号绑定在一起。如果指定的端口被其它的进程占用,则 bind 操作会失败。
  • 调用 listen 函数,声明当前这个文件描述符作为一个服务器的文件描述符,为后面的 accept 做好准备。
  • 调用 accept 函数,并阻塞等待客户端的连接请求。当有客户端连接请求达到时,accept 函数会返回一个新的文件描述符,用于与该客户端进行通信。

通过上述步骤,服务器完成了初始化并准备好接收客户端的连接请求。在调用 accept 函数时,服务器将会阻塞,直到有客户端连接请求达到为止。这样,服务器可以与客户端建立连接,并进行后续的数据交换和处理。

建立TCP连接的过程:

  • 调用 socket 函数创建一个文件描述符,用于后续网络通信。
  • 调用 connect 函数,向服务器发起连接请求。connect 函数会发送一个 SYN(同步)段,并阻塞等待服务器的应答。
  • 服务器收到客户端发送的 SYN 段后,会向客户端发送一个 SYN-ACK(同步 - 确认)段,表示同意客户端的连接。服务器为该连接分配一个新的序列号,并等待客户端的确认。
  • 客户端收到服务器发送的 ACK 段后,会从 connect() 函数返回,同时发送一个 ACK 段作为确认。客户端也会为连接分配一个新的序列号。
  • 服务端收到客户端发送的 ACK 段后,确认连接成功。此时,客户端和服务器已经成功建立连接,可以进行数据的传输了。

这个建立连接的过程,通常被称为 "三次握手",双方确认了连接,开始进行数据交换。需要注意的是,连接并不是调用函数后立即建立成功的,由于TCP是属于传输层协议,在建立连接时双方的操作系统会自主进行三次握手协商,协商完成之后,才可以连接成功。

数据传输过程

TCP协议负责处理数据的可靠传输和流量控制等底层细节,使得应用程序可以通过 read 和 write 函数进行数据的读写操作,而无需关系具体的数据传输细节。这样,应用程序可以方便地进行数据交互,而底层的TCP协议确保了数据的可靠传输和顺序保证。

数据传输的过程如下:

  • 建立连接后,TCP协议提供全双工的通信服务;所谓全双工的意思是,在同一条连接中,同一时刻,通信双方可以同时进行数据的读写操作;相对的概念叫做半双工,同一条连接在同一时刻,只能由一方来写数据。
  • 服务器从 accept() 函数返回后,立即调用 read() 来读取数据,读 socket 就像管道一样,如果没有数据到达就阻塞等待。
  • 此时,客户端调用 write() 函数向服务器发送请求,服务器收到请求后,从 read() 函数返回并开始处理客户端的请求。在此期间,客户端调用 read() 函数阻塞等待客户端的应答。
  • 服务器调用 write() 函数将处理结果发送给客户端,再次调用 read() 函数阻塞等待下一条请求。
  • 客户端收到服务器的应答后,从 read() 函数返回,并发送下一条请求。这样循环往复,实现了双方之间的数据传输。

断开连接问题

当双方通信结束后,通过四次挥手的方案进行连接的断开。在TCP协议中,每个端需要发送一个 FIN 段来表示自己不再需要发送数据,而对方需要发送一个 ACK 段进行确认。因此,客户端和服务端双方 close() 操作最终对应的就是四次挥手过程。

通信双方断开连接的过程:

  • 当客户端没有请求需要发送时,客户端调用 close() 函数关闭连接,客户端会向服务器发送一个 FIN 段作为请求关闭连接的信号(第一次挥手)。
  • 服务器收到 FIN 段后,回应一个 ACK 段,表示已经收到关闭请求,同时服务器调用 read() 函数会返回0(第二次挥手)。
  • 当服务器收到客户端的 ACK 段并且 read() 函数返回0后,服务器就直到客户端关闭了连接。这时如果服务端也没有数据发送给客户端了,也调用 close() 函数关闭连接,并向客户端发送一个 FIN 段(第三次挥手)。
  • 客户端收到 FIN 段后,会回应一个 ACK 段,表示收到关闭请求(第四次挥手)。
  • 此时,通信双方都关闭并收到了对方的响应。此时断开连接成功。

这个断开连接的过程,通常称为 "四次挥手"。

在学习 socket API 时要注意应用程序和TCP协议层是如何交互的:

  1. 应用程序调用某个 socket 函数时TCP协议层完成什么动作,比如调用 connect() 会发出 SYN 段。
  2. 应用程序如何知道TCP协议层的状态变化,比如从某个阻塞的 socket 函数返回就表明TCP协议收到了某些段,再比如 read() 返回0就表明了收到 FIN 段。

应用程序通过 socket API 调用不同的函数与TCP协议层进行交互。TCP协议层负责处理底层的连接建立、数据传输和连接关闭等细节。通过阻塞式的 Socket API 函数,应用程序可以触发TCP协议层的操作并等待相应的响应,以实现数据的读写和连接状态的变化通知。

相关推荐
Think Spatial 空间思维3 分钟前
【HTTPS基础概念与原理】TLS握手过程详解
数据库·网络协议·https
2501_9159090642 分钟前
开发日常中的抓包工具经验谈:Charles 抓包工具与其它选项对比
websocket·网络协议·tcp/ip·http·网络安全·https·udp
Johny_Zhao1 小时前
Vmware workstation安装部署微软SCCM服务系统
网络·人工智能·python·sql·网络安全·信息安全·微软·云计算·shell·系统运维·sccm
会员果汁1 小时前
网络实验-VRRP
网络
XiaoCCCcCCccCcccC1 小时前
Linux 的 UDP 网络编程 -- 回显服务器,翻译服务器
linux·网络·udp
獨枭1 小时前
Visual Studio 2022 跨网络远程调试
网络·ide·visual studio
深度学习04071 小时前
【网络实验】-BGP-EBGP的基本配置
网络·智能路由器
阿斯顿法国红酒快2 小时前
Windows系统安全加固
网络·windows·安全·网络安全·系统安全·ddos
sun0077003 小时前
windows 10 做服务器 其他电脑无法访问,怎么回事?
运维·服务器·网络
2401_896008194 小时前
TCP连接状态说明
运维·服务器·网络