TCP三次握手和四次挥手

196 阅读3分钟

IP地址加上端口号就叫套接字socket

网络请求流程:

  • 1、TCP三次握手建立连接
  • 2、客户端和服务端互相发送信息【客户端发送请求,服务端响应内容】
  • 3、TCP四次挥手关闭连接
三次握手流程:

为什么需要三次握手,因为TCP/IP不可靠,为了在不可靠建立起一种可靠传输,必须要有握手确认机制,为啥三次,因为TCP是全双工协议,需要通信双方同时通信,所以在此基础上的双向确认最少需要三次

TCP报文里面有SYN(Synchronization,即同步序列编号),ACK(Acknowledgment,即确认字符)和FIN(码位字段)等标识,如果设置1就是开启这些标识,设置0就是关闭这些标识。 TCP报文还有个Sequence序号【应用程序可能连续发送多个序号给服务器,用这个做区分】,随机生成,作为初始值来进行后续的判断依据,保证通道的唯一性。

  • 在客户端发送TCP报文的时候,会把SYN开启,携带Sequence序号,比如叫8888,表示请求连接;
  • 当服务器收到SYN以后,需要做响应,服务器会在TCP报文中把SYN和ACK开启,表示确认同步的意思,服务器也生成自己的Sequence序号,比如叫9999,另外加上确认号,在收到客户端发来的Sequence序号+1得到,即8888+1
  • 客户端收到服务器发来的Sequence序号后就知道是不是自己发送的TCP报文,客户端还需要确认让服务器知道发出去的“确认同步”是否被接收。客户端第二次发给服务端的确认号是根据服务端序号303再加1得到,即9999+1

TCP三次握手.png

四次挥手流程:

为什么需要四次挥手,因为服务端可能存在未发送完毕的数据

客户端和服务端都能主动发起关闭请求。

FIN(Finish,即结束的意思)

比如客户端主动发起关闭请求:

  • 客户端在报文中开启FIN和ACK两个控制位,因为发送HTTP和响应的时候序号和确认号被不断递增,因此不用固定数字来表示序号和确认号了。
  • 服务端会先发送一个ACK来进行确认,自己的序号用对方的确认号,确认号用对方的序号+1,虽然发送了TCP报文,但此时客户端并未正式关闭通道,因为服务端那边可能还有需要发送的数据
  • 等服务端发送完数据以后会再发送一个FIN+ACK来进行最后的确认,此时序号和确认号不需要改变
  • 客户端得到最终的结束确认以后会发送ACK来进行确认,此时客户端的序号需要用对方的确认号,自己的确认号用对方的序号+1

TCP四次挥手.png