TCP中的“三次握手”和“四次挥手”(全)

目录

一、网络协议模型

二、TCP/UDP

什么时候应该使用TCP?

什么时候应该使用UDP?

三、TCP报文

四、TCP三次握手

为什么要三次握手?

五、四次分手

为什么要四次分手?

为什么要等待2MSL?


我们在学习计算机网络的过程中肯定会学习到它的传输方式,以及他的工作模型等。下面给大家分享自己借鉴总结的相关知识点,跟大家分享,大自然的搬运工。

一、网络协议模型

首先,我们先了解下TCP/IP协议模型,并与OSI模型的对比参考

应用层   应用层
表示层  
会话层  
传输层   传输层
网络层   网络层
数据链路层   网络接口层
物理层  

 

二、TCP/UDP

这次我们要分析的TCP属于网络层协议,其中还包括UDP(后边一起吐槽),虽然都在网络层,但也有不同的特性,同时也具有不同的应用场景,下边对比分析。

  TCP UDP
可靠性 可靠 不可靠
连续性 面向连接 无连接
报文 面向字节流 面向报文
效率 传输效率低 传输效率高
双工性 全双工 一对一、一对多、多对一、多对多
流量控制 滑动窗口控制 无控制
拥塞控制 慢开始、拥塞避免、快重传、快恢复
传输速度
应用场景 对效率要求低,对准确性要求高或者要求有连接的场景 对效率要求高,对准确性要求低
应用协议层 SMTP、TELNET、HTTP、FTP等 DNS、TFTP、SNMP、NFS等

什么时候应该使用TCP?

当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。

什么时候应该使用UDP?

当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。

三、TCP报文

  16位 16位  
TCP首部 源 端 口 目 的 端 口 20字节的固定首部
序   号
确  认 号
数据偏移 保留 URG ACK PSH RST SYN FIN 窗  口
校 验 紧 急 指 针
选项(长度可变) 填 充  
  数   据

URG(urgent) :紧急指针是否有效。为1,表示某一位需要被优先处理
ACK(acknowledgement):确认号是否有效,一般置为1
PSH(push):提示接收端应用程序立即从TCP缓冲区把数据读走
RST(reset):对方要求重新建立连接,复位。
SYN(synchronous):请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
FIN (finish):希望断开连接。

四、TCP三次握手

TCP中的“三次握手”和“四次挥手”(全)_第1张图片

第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态; 

第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

TCP三次握手就好比两个人在街上隔着50米看见了对方,但是因为雾霾等原因不能100%确认,所以要通过招手的方式相互确定对方是否认识自己。

  1. 张三首先向李四招手(syn),李四看到张三向自己招手后,向对方点了点头挤出了一个微笑(ack)。张三看到李四微笑后确认了李四成功辨认出了自己(进入estalished状态)。
  2. 但是李四还有点狐疑,向四周看了一看,有没有可能张三是在看别人呢,他也需要确认一下。
  3. 所以李四也向张三招了招手(syn),张三看到李四向自己招手后知道对方是在寻求自己的确认,于是也点了点头挤出了微笑(ack),李四看到对方的微笑后确认了张三就是在向自己打招呼(进入established状态)。
  4. 于是两人加快步伐,走到了一起,相互拥抱

为什么要三次握手?

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。

五、四次分手

第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

TCP断开链接的过程和建立链接的过程比较类似,只不过中间的两部并不总是会合成一步走,所以它分成了4个动作,张三挥手(fin)——李四伤感地微笑(ack)——李四挥手(fin)——张三伤感地微笑(ack)。

  1. 之所以中间的两个动作没有合并,是因为tcp存在「半关闭」状态,也就是单向关闭。
  2. 张三已经挥了手,可是人还没有走,只是不再说话,但是耳朵还是可以继续听,李四呢继续喊话。等待李四累了,也不再说话了,超张三挥了挥手,张三伤感地微笑了一下,才彻底结束了。

为什么要四次分手?

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

为什么要等待2MSL?

MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。原因有二:

  • 保证TCP协议的全双工连接能够可靠关闭

  • 保证这次连接的重复数据段从网络中消失

第一点:如果主机1直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致主机2没有收到主机1最后回复的ACK。那么主机2就会在超时之后继续发送FIN,此时由于主机1已经CLOSED了,就找不到与重发的FIN对应的连接。所以,主机1不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。

第二点:如果主机1直接CLOSED,然后又再向主机2发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达主机2,由于新连接和老连接的端口号是一样的,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。

 

 

 

————————————————
借鉴原文链接:
掘金:https://juejin.im/post/598ba1d06fb9a03c4d6464ab(关于 TCP/IP,运维必知必会的十个问题)
CSDN:https://blog.csdn.net/qq_25948717/article/details/80382766(TCP三次握手中SYN,ACK,Seq含义)
简书:https://www.jianshu.com/p/573700560be0(TCP报文格式说明)
知乎:https://zhuanlan.zhihu.com/p/40667482(【TCP】详解TCP 三次握手和四次挥手)

 

你可能感兴趣的:(网络协议,TCP/UDP,报文,网络通信,网络协议,http,网络,运维)