Network——TCP/IP协议三次握手四次挥手

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fancynece/article/details/80030547

我们都知道,TCP/IP协议是面向连接的协议,即客户端与服务器建立连接之后,在连接断开之前都可相互传送数据。

所谓三次握手与四次挥手,是客户端与服务器之间建立连接的过程。

我们先来看一下TCP报文的格式。

这里写图片描述

  • Seq序号:即图中的32位序号,标识发送方 向 接收方发送的字符流
  • Ack序号:即图中的32位确认序号,只有当ACK=1时,序号才有效
  • SYN:发起一个连接
  • ACK:确认序号有效
  • FIN:释放一个连接

三次握手

这里写图片描述

  1. 客户端向服务器发送一个随机seq = x,置SYN = 1,表明希望建立连接
  2. 服务器向客户端发送对seq序列的确认序列ack = x + 1,并置ACK = 1表示确认序列有效;为测试客户端是否真的想建立连接,服务器也发送一个seq = y给它,并置SYN = 1,表明可以建立连接
  3. 客户端向服务器发送seq序列seq = x + 1,并对服务器发来的seq序列予以确认ack = y + 1,置ACK = 1表明ack序列有效
为什么是三次握手?不是两次?

如果是两次握手的话,很显然需要将第三次的报文传送去掉。

现在假设这么一个情况:

客户端先向服务器发送了一个请求连接的报文,seq = x,但这个报文没有达到服务端,在某处滞留。

客户端过了等待时间后,认为服务器没有接受到报文,因此重新发了一个请求连接报文,seq = y,这次服务器接收到并成功建立连接。

当这次连接释放之后,服务器接收到了第一个请求连接报文并发送连接报文给客户端,又建立了一次连接,然而这次连接本不应该建立。

四次挥手

这里写图片描述

扫描二维码关注公众号,回复: 5738083 查看本文章
  1. 客户端向服务器发送报文,报文中seq = u,FIN = 1表明希望释放链接
  2. 服务器向客户端发送报文,报文中seq = v,ack = u + 1,ACK = 1
  3. 接下来,服务器向客户端发送需要发送的数据
  4. 数据发送结束后,服务器向客户端发送报文,报文中,seq = w,ack = u + 1,ACK = 1,FIN = 1
  5. 客户端向服务器发送报文,报文中seq = u + 1,ack = w + 1,ACK = 1
为什么是四次挥手?不是三次?

因为客户端希望释放连接时,只是客户端没有数据再传送给服务器,而服务器可能还会有数据要传送给客户端。

猜你喜欢

转载自blog.csdn.net/fancynece/article/details/80030547
今日推荐