首页 > 其他分享 >TCP的三次握手与四次挥手

TCP的三次握手与四次挥手

时间:2023-02-24 15:47:25浏览次数:31  
标签:seq ACK 握手 TCP --- ack 四次 服务器 客户端

三次握手

三次握手

客户端回合-第一次握手

  • SYN=1 (同步标志, Synchronize)
  • seq=x

服务器回合-第二次握手

  • SYN=1
  • ACK=1 (确认标志, Acknowledgement)
  • ack=x+1 (Acknowledgement Number,收到的序号+1,下一个预期的序列编号)
  • seq=y

客户端回合-第三次握手

  • ACK=1
  • ack=y+1
  • seq=x+1

注意

  • 大写的ACK和SYN是标志位,也就是flag,也就是只有0或1,表示一种状态
  • SYN只在前两个握手里存在,是一种建立连接的意愿,双方互相了解对方的意愿之后就不用再发了
  • 仅当ACK=1时确认号字段才有效。 当ACK=0时,确认号无效。TCP规定:在连接建立后,所有传送的报文段都必须把ACK置为1
  • seq表示一个TCP包的序号,可以看出客户端和服务器各自有自己的序号,这样双方就能知道对方发来的数据的顺序
  • 小写的ack为自己确认收到的最后一TCP包的序号+1,告知对方我想要的下一个包的开始是什么

形象一些:

客户端:

SYN=1 ---> 我想要建立TCP连接,请问可以吗

seq=x ---> 这条信息是我发的第x条信息

服务器:

SYN=1 ---> 我同意和你建立TCP连接

ACK=1 ---> 这条信息包含确认信息

ack=x+1 ---> 我收到的你发来的最后一条信息是第x条,下一条信息你应当从x+1开始发

seq=y ---> 这条信息是我发的第y条信息

客户端:

ACK=1 ---> 这条信息包含确认信息

ack=y+1 ---> 我收到的你发来的最后一条信息是第y条,下一条信息你应当从y+1开始发

seq=x+1 ---> 这条信息是我发的第x+1条信息

另外,所谓的握手,我认为是某一方发送的消息到达对方的那一刻称为握手。这表明我发送了消息,你收到了消息,我们两个共同知晓了这条消息,像握手一样。在图中就是箭头到达对方那一刻。

四次挥手

四次挥手

客户端回合-第一次挥手

  • FIN=1 (Finish)
  • seq=u

服务器回合-第二次挥手

  • ACK=1
  • ack=u+1
  • seq=v

服务器回合-第三次挥手

  • FIN=1
  • ACK=1
  • ack=u+1
  • seq=w

客户端回合-第四次挥手

  • ACK=1
  • ack=w+1
  • seq=u+1

注意

  • 所谓的服务器和客户端只是一个名字,不论是建立连接还是断开连接,我们都认为率先发起的为客户端,被动接受的为服务器
  • 第二和第三次挥手都是服务器回合,服务器首先回复表示收到了数据,然后传送剩余的没传完的数据,然后准备关闭连接
  • seq=w和seq=v之间的数据就是剩余的没传完的数据,同时,这两次回复的确认号都是ack=u+1
  • 由于客户端发起的关闭连接请求,所以认为他数据已经传输完毕,所以在第二和第三次挥手之间不传输数据

形象一些,就像你妈喊你吃饭,而你在打游戏。

妈妈(客户端) 你(服务器) 类比
“吃饭了” 客户端请求关闭连接
“来了”,但没有动 服务器收到关闭连接的请求并回复
赶紧找到游戏的存档点并保存 服务器传输剩下的没传完的数据
“来了”,并走向厨房,“今天中午吃什么” 服务器的第三次挥手,确认关闭连接
“面条。快点吃吧,饭都凉了” 客户端确认自己收到了服务器的“确认关闭连接”

中间的两次“来了”都是在确认妈妈第一次喊的“吃饭了”。

那么,基于上面的类比,解释客户端TIME_WAIT状态的意义是什么?

为了防止你没有听到“面条”这个回答。如果你没有听到,你会再问一遍,直到听到答案。

放到网络环境里就是:

第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server没有收到ACK(上次自己发的消息没有被确认,他会认为自己的消息丢了,所以重发上次的消息),就会重发FIN,如果Client在2MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。

MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

标签:seq,ACK,握手,TCP,---,ack,四次,服务器,客户端
From: https://www.cnblogs.com/roadwide/p/17151697.html

相关文章

  • TCP/UDP
    TCP与UDP在后台都用到套接字Socket,当准确度要求高的时候,用TCP。若追求性能和速度,而且对准确度要求不高时,用UDP。TCP协议和UDP协议连接过程的区别如下:基于连接与无连接;......
  • 深度好文:TCP三次握手和四次挥手深入实践
     TCP连接状态 图1是TCP三次握手、数据传输、四次挥手三个阶段的状态转移图,状态说明如下: LISTEN:侦听来自客户端的TCP端口的连接请求SYN-SENT:再发送连接请求后等......
  • 换个角度理解TCP建立连接为什么需要三次握手
    1、第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。2、换个易于理解的视角来看为什么要3次握手。客户端和服务端通信前要进行连接,“3次握手”的......
  • TCP和UDP的区别及使用场景
    一、TCP和UDP是什么?   TCP:   传输控制协议(TCP,TransmissionControlProtocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。   ......
  • nginx TCP代理增加日志配置
    在straem增加一下配置stream{log_formatTCP_proxy'$remote_addr-[$time_local]''$protocol$status$bytes_sent$bytes_received''......
  • TCP 三次握手四次挥手具体原理——转载
    【TCP/IP】TCP协议的流程图解  一、TCP协议起步#1.什么是TCP协议#TCP是面向连接的协议,这是因为在一个应用进程可以开始向另一个应用进程发送数据之前,这两个进程必......
  • IDEA - MySql / Spring mvc : Exception in thread "RMI TCP Connection(idle)" java.
    运行Intellijidea时output窗口出现该问题:Exceptioninthread“RMITCPConnection(idle)”java.lang.OutOfMemoryError:PermGenspace导致有些功能不能继续执行。运行......
  • 套接字连接以及TCP三次握手详解
    在套接字和地址文章中,我们画出基于套接字接口网络应用的一张图,本文章就是详细解释这些函数具体怎么实现的。socket创建套接字客户端和服务器使用socket函数来创建一个套......
  • tcp的粘包现象
    粘包现象只出现在tcp协议中多条消息之间没有边界,并且还有一大堆优化算法发送端:两条消息很短并且发送的间隔很短接收端:接收消息不及时解决粘包问题的本......
  • tcpdump用法
    超详细的网络抓包神器tcpdump使用指南https://juejin.cn/post/68449040841687695491.基本语法和使用方法tcpdump的常用参数如下:$tcpdump-ieth0-nn-s0-vport80-......