15 张图,了解一下 TCP/IP 必知也必会的 10 个问题( 三 )
第二次握手:服务器收到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三次握手 。
为什么要三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端 , 因而产生错误 。
具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失 , 而是在某个网络结点长时间的滞留了 , 以致延误到连接释放以后的某个时间才到达server 。 本来这是一个早已失效的报文段 。 但server收到此失效的连接请求报文段后 , 就误认为是client再次发出的一个新的连接请求 。
于是就向client发出确认报文段 , 同意建立连接 。 假设不采用“三次握手” , 那么只要server发出确认 , 新的连接就建立了 。 由于现在client并没有发出建立连接的请求 , 因此不会理睬server的确认 , 也不会向server发送数据 。 但server却以为新的运输连接已经建立 , 并一直等待client发来数据 。 这样 , server的很多资源就白白浪费掉了 。 采用“三次握手”的办法可以防止上述现象发生 。 例如刚才那种情况 , client不会向server的确认发出确认 。 server由于收不到确认 , 就知道client并没有要求建立连接 。 ”
2、四次挥手当客户端和服务器通过三次握手建立了TCP连接以后 , 当数据传送完毕 , 肯定是要断开TCP连接的啊 。 那对于TCP的断开连接 , 这里就有了神秘的“四次分手” 。
文章插图
第一次分手:主机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协议是一种面向连接的、可靠的、基于字节流的运输层通信协议 。 TCP是全双工模式 , 这就意味着 , 当主机1发出FIN报文段时 , 只是表示主机1已经没有数据要发送了 , 主机1告诉主机2 , 它的数据已经全部发送完毕了;但是 , 这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时 , 表示它已经知道主机1没有数据发送了 , 但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时 , 这个时候就表示主机2也没有数据要发送了 , 就会告诉主机1 , 我也没有数据要发送了 , 之后彼此就会愉快的中断这次TCP连接 。
为什么要等待2MSL?MSL:报文段最大生存时间 , 它是任何报文段被丢弃前在网络内的最长时间 。 原因有二:
- 保证TCP协议的全双工连接能够可靠关闭
- 保证这次连接的重复数据段从网络中消失
第二点:如果主机1直接CLOSED , 然后又再向主机2发起一个新连接 , 我们不能保证这个新连接与刚关闭的连接的端口号是不同的 。 也就是说有可能新连接和老连接的端口号是相同的 。 一般来说不会发生什么问题 , 但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的 , 如果前一次连接的某些数据仍然滞留在网络中 , 这些延迟数据在建立新连接之后才到达主机2 , 由于新连接和老连接的端口号是一样的 , TCP协议就认为那个延迟的数据是属于新连接的 , 这样就和真正的新连接的数据包发生混淆了 。 所以TCP连接还要在TIME_WAIT状态等待2倍MSL , 这样可以保证本次连接的所有数据都从网络中消失 。
- 早报:高通骁龙888正式发布 嫦娥五号传回首张图片
- 双行合一|关于Word我们要了解的知识(12)
- 模式|刚了解到无货源电商模式,淘宝好还是抖音小店好?
- 微信|微信转账点收款就能收到钱了?这个“秘密”要了解,很多人上当了
- 海淀区|海淀城市大脑“时空一张图”上线
- 打火机|为什么收到快递,一定要用打火机烤一下?现在不看,以后会吃大亏
- 工地|“智慧工地”是什么?记者带你全方位了解
- 简单|行车记录仪数据丢失怎么办?想要简单恢复,那还不试一下这个?
- 这些错误,程序员经常会犯,你了解过吗?
- 快速概览 + 详细了解N:N聚类算法是如何应用的