TCP三次握手和四次挥手

TCP/IP是传输层协议,传输层在整个网络体系中都处于中间,起到一个承上启下的作用,建立端到端连接

TCP通讯流程

握手之前

IP地址:端口号 又叫做 套接字socket,套接字socket就是握手前的核心条件。socket 的本意是“插口或插槽”,顾名思义,可以将 socket 想象成一根网线,一头插在客户端,一头插在服务端,然后进行通信,故客户端与服务端在通信之前必须要创建一个 socket。

三次握手

image-20220419184425276

  1. 首先,客户端把SYN开启,请求数据的同步。还会有一个重要的字段Seq序号。seq是随机生成。

    seq是随机生成的,作为初始值来进行后续判断依据,这样就更加保证了通道的唯一性。

  2. 服务端收到后返回SYN和ACK,并把自己的确认号设为对方的序号+1

  3. 客户端收到后,给服务端返回ACK确认报文,并把自己的确认号,设为对方的序号+1,序号设为对方的确认号

握手后

三次握手后,就正式建立连接了,这时的客户端就可以发送HTTP请求了,然后服务器响应内容。

四次挥手

内容交流完毕后,各自可能就会发起关闭连接的要求,也就是四次挥手的过程。需要注意的是,客户端和服务端都能主动发起关闭请求。

如下,假设客户端主动发起关闭请求:

image-20220419185627655

  1. 客户端首先会在报文中开启FIN和ACK两个控制位
  2. 服务端收到后发送ACK确认。自己的确认号用对方的序号+1
  3. 虽然客户端发起了TCP报文,也就是关闭请求,但是此时客户端并未正式关闭通道,因为服务端可能还有发送的数据,所以需要等服务端发送完数据后,会再发送一个FIN+ACK来进行最后的确认,这是的序号和确认号不需要改变(因为并没有一来一回,只是多了一个控制位FIN来确认结束步骤。)
  4. 客户端得到最终的结束确认后,会发送ACK来进行确认,这时的序号是对方的确认号+1

要是问为什么要四次挥手?如上第三步,就是答案。

为什么要三次握手,而不是两次?

为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤。
如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。

三次握手过程中,当一方收到报文后,会将自己的确认号设为对方的序号+1,所以说无论是连接发起方还是接受方他们所生成的序列号都可以被确认。这样就保证了可靠通信。

TCP和UDP的区别

补充一下TCP UDP区别

UDP(用户数据报协议) TCP(传输控制协议)
是否连接 无连接 面向连接
是否可靠 不可靠传输,不使用流量控制和拥塞控制 可靠传输(数据顺序正确性),使用流量控制和拥塞控制
连接对象个数 支持一对一,一对多,多对一和多对多交互通信(单播,多播,广播的功能 只能是一对一通信
传输方式 面向报文(UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界,仅添加首部后就向下交付给IP层) 面向字节流(在不保留报文边界的情况下以字节流方式进行传输)
首部开销 首部开销小,仅8字节 首部最小20字节,最大60字节
适用场景 适用于实时应用,例如视频会议、直播、广播 适用于要求可靠传输的应用,例如文件传输、接受邮件、远程登录。