TCP通信及握手 | 青训营笔记

78 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记

TCP与UDP的区别

UDP:用户数据报协议,面向无连接,可以单播,多播,广播,面向数据报,不可靠

TCP:传输控制协议,面向连接的,可靠的,基于字节流,仅支持单播传输

UDPTCP
是否创建连接无连接面向连接
是否可靠不可靠可靠
连接对象个数一对一、多对一、一对多、多对多仅支持一对一
传输方式面向数据报面向字节流
首部开销8字节至少20字节
适用场景实时应用(视频会议、直播)可靠性高的应用(文件传输……)

TCP通信流程

服务器端

  1. 创建一个用于监听的套接字
    • 监听:监听有客户端的连接
    • 套接字:这个套接字其实就是一个文件描述符
  2. 将这个监听文件描述符和本地的IP和端口绑定(IP和端口就是服务器的地址信息)
    • 客户端连接服务器的时候使用的就是这个IP和端口
  3. 设置监听,监听的fd开始工作
  4. 阻塞等待,当有客户端发起连接,解除阻塞,接受客户端的连接,会得到一个和客户端通信的套接字(fd)
  5. 通信
    • 接收数据
    • 发送数据
  6. 通信结束,断开连接

客户端

  1. 创建一个用于通信的套接字(fd)
  2. 连接服务器,需要指定连接的服务器的IP和端口
  3. 连接成功了,客户端可以直接和服务器通信
    • 接收数据
    • 发送数据
  4. 通信结束,断开连接

三次握手

TCP是面向连接的单播协议

image-20220513200828215

第一次握手

客户端给服务器发送一个SYNSYN段(在 TCPTCP 标头中 SYNSYN 位字段为 1TCP/IPTCP/IP 数据包), 该段中也包含客户端的初始序列号(Sequencenumber=J)(Sequence number = J)

SYN是同步的缩写,SYN 段是发送到另一台计算机的 TCP 数据包,请求在它们之间建立连接

第二次握手

客户端给服务器响应一个ACKACK段(在 TCPTCP 标头中 ACKACK 位字段为 1TCP/IPTCP/IP 数据包), 该段中使 Acknowledgmentnumber=K+1Acknowledgment number = K + 1来表示确认已收到服务器的 SYNSYN(Sequencenumber=K)(Sequence number = K)

第三次握手

客户端给服务器响应一个ACKACK段(在 TCPTCP 标头中 ACKACK 位字段为 1TCP/IPTCP/IP 数据包), 该段中使 Acknowledgmentnumber=K+1Acknowledgment number = K + 1来表示确认已收到服务器的 SYNSYN(Sequencenumber=K)(Sequence number = K)

滑动窗口

属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量。

TCP通过滑动窗口的概念来进行流量控制。设想在发送端发送数据的速度很快而接收端接收速度却很慢的情况下,为了保证数据不丢失,显然需要进行流量控制, 协调好通信双方的工作节奏。所谓滑动窗口,可以理解成接收端所能提供的缓冲区大小。TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓 冲区。由于窗口由16位bit所定义,所以接收端TCP 能最大提供65535个字节的缓冲。由此,可以利用窗口大小和第一个数据的序列号计算出最大可接收的数据序列号。

滑动窗口本质上是描述接受方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。如果发送方收到接受方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接受方发送窗口大小不为0的数据报的到来。

四次挥手

发生在断开连接的时候,TCP连接时,建立的连接是双向的,在断开的时候需要双向断开

image-20220513200841678