TCP协议三次握手和四次挥手

  • 三次握手
    • 如果建立连接只需要2次握手,可能会出现的情况
  • 四次挥手
    • 为什么建立连接是三次握手,关闭连接确是四次挥手呢?
    • TIME_WAIT状态有什么作用,为什么主动关闭方没有直接进入CLOSED状态释放资源?
    • 为什么TIME_WAIT状态需要经过2MSL才能进入CLOSE状态?

三次握手

形象比喻
将小明当作客户端,小红当作服务器端,两人写信告白:
第一次握手:
小明告诉小红:我喜欢你。
第二次握手:
小红告诉小明:我知道了,我也喜欢你。
此时小红并不确定小明是否收到了告白信,直到
第三次握手:
小明回信:我也知道了,我们在一起吧。此时才真正建立连接。

标记位 解释
SYN 请求号标记位
ACK 确认号标记位
seq 序号,代表请求方将会发送的数据的第一个字节编号
ack 返回的确认号,代表接收方收到收据后(也就是前面说的seq),代表希望对方下一次传输数据的第一个字节编号
状态位 解释
CLOSED client处于关闭状态
LISTEN server处于监听状态,等待client连接
SYN-RCVD 表示server接受到了SYN报文,当收到client的ACK报文后,它会进入到ESTABLISHED状态
SYN-SENT 表示client已发送SYN报文,等待server的第2次握手
ESTABLISHED 表示连接已经建立
  • 第一次握手:客户端第一次发送一条连接请求数据,SYN = 1,ACK = 0就是代表建立连接请求,发送的具体数据第一个字节编号记为x,赋值seq。

  • 第二次握手:服务端收到请求后,返回 客户端的SYN = 1,加上自己的确认号ACK=1,发送的具体数据第一个字节编号记为y,赋值seq,希望客户端下一次返回编号x + 1个字节为止的数据,记为ack = x + 1。

客户端得出客户端发送接收能力正常,服务端发送接收能力也都正常,但是此时服务器并不能确认客户端的接收能力是否正常

  • 第三次握手:客户端收到服务端返回的请求确认后,再次发送数据,原封不动返回ACK = 1,这里就不需要再发送 SYN=1了,为什么呢?因为此时并不是跟服务端进行连接请求,而是连接确认,所以只需要返回ACK = 1代表确认,同样的,发送的具体数据第一个字节编号记为seq = x + 1,希望服务端下次传输的数据第一个字节编号记为ack = y + 1

为什么TCP建立连接时候,要进行3次握手,2次不行吗?
一句话的答案:主要目的:防止server端一直等待,浪费资源,

如果建立连接只需要2次握手,可能会出现的情况

假设client发出的第一个连接请求报文段,因为网络延迟,在连接释放以后的某个时间才到达server 。
本来这是一个早已失效的连接请求,但server收到此失效的请求后,误认为是client再次发出的一个新的连接请求 。
于是server就向client发出确认报文段,同意建立连接。
如果不采用“3次握手”,那么只要server发出确认,新的连接就建立了 。
由于现在client并没有真正想连接服务器的意愿,因此不会理睬server的确认,也不会向server发送数据 。
但server却以为新的连接已经建立,并一直等待client发来数据,这样,server的很多资源就白白浪费掉了
采用“三次握手”的办法可以防止上述现象发生 ,例如上述情况,client没有向server的确认发出确认,server由于收不到确认,就知道client并没有要求建立连接。

四次挥手

形象比喻
恋爱之后,小明和小红煲电话粥。依旧将小明当作客户端,小红当作服务器端。小明跟小红说话,
第一次挥手:
小明说:我说完了。
第二次挥手:
小红说:好的,我知道了,我还没说完。
小红继续吧啦吧啦,说完之后
第三次挥手:
小红告诉小明:我说完了。
第四次挥手:
小明收到后告诉小红:好的,我知道了。等了2MSL之后小明挂断了。
如果此时小红说完,等了2MSL,小明一直不出声,这个时候就会重新说一次:我说完了。直到收到小明最后的回复,才挂断电话。

状态位: FIN = 1:代表要求释放连接

  • 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  • 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
  • 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。为了确保正确关闭连接,所以需要四次。

TIME_WAIT状态有什么作用,为什么主动关闭方没有直接进入CLOSED状态释放资源?

答:防止连接关闭时四次挥手中的最后一次ACK丢失:如果主动关闭方进入CLOSED状态后,被动关闭方发送FIN包后没有得到ACK确认,超时后就会重传一个FIN包。如果客户端没有TIME_WAIT状态而直接进入CLOSED状态释放资源,下次启动新的客户端就可能使用了与之前客户端相同的地址信息,有两个危害,第一种是这个刚启动的新的客户端绑定地址成功时,就会收到了一个重传的FIN包,对新连接就会造成影响。第二种是如果该新客户端向相同的服务端发送SYN连接请求,但是此时服务端处于LAST_ACK状态,要求收到的是ACK而不是SYN,因此就会发送RST重新建立请求。

为什么TIME_WAIT状态需要经过2MSL才能进入CLOSE状态?

答:MSL指的是报文在网络中最大生存时间。在客户端发送对服务端的FIN确认包ACK后,这个ACK包有可能到达不了,服务器端如果接收不到ACK包就会重新发送FIN包。所以客户端发送ACK后需要留出2MSL时间(ACK到达服务器器+服务器发送FIN重传包,一来一回)等待确认服务器端缺失收到了ACK包。也就是说客户端如果等待2MSL时间也没收到服务器端重传的FIN包,则就可以确认服务器已经收到客户端发送的ACK包

通俗易懂理解TCP协议三次握手和四次挥手及其常见问题相关推荐

  1. TCP协议“三次握手“和“四次挥手“

    TCP协议三次握手和四次挥手 为了使数据的传输更为安全,在OSI七层架构的传输层(TCP)定义了需要建立稳定的连接提供安全的交互环境,而三次握手解决了连接的建立. 三次握手过程: 第一次:客户端向服务 ...

  2. 理解TCP/IP三次握手与四次挥手的正确姿势

    为什么80%的码农都做不了架构师?>>>    背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 问题 有时候聊天的过 ...

  3. TCP协议---三次握手和四次挥手详解 (不看后悔系列)

    目录 TCP协议简介 TCP报头 TCP工作原理 科来解码详解 wireshark解码详解 三次握手和四次挥手 数据包的大致结构 你不知道的三次握手 为什么需要有三次握手? 为啥只有三次握手才能确认双 ...

  4. TCP协议三次握手和四次挥手

    (接上文) 3.5传输层协议(TCP/UDP) 传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程 ...

  5. TCP协议三次握手及四次挥手

    文章目录 TCP 三次握手 第一次握手(SYN=1, seq=x) 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1) 第三次握手(ACK=1,ACKnum=y+1) 为什么 ...

  6. TCP协议——三次握手与四次挥手

    TCP协议 是一种面向连接的.可靠的.基于字节流的传输层通信协议.面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接.TCP使用的流量控制协议 ...

  7. 白话解说TCP/IP协议三次握手和四次挥手

    白话解说TCP/IP协议三次握手和四次挥手 1.背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 1.1.问题 有时候聊天的过程中,我的 ...

  8. 一文搞懂TCP的三次握手和四次挥手

    目录 1.三次握手 2.四次挥手 3.11种状态名词解析 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开. 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所 ...

  9. 为什么有TCP 的三次握手 和 四次挥手

    由于我们的设备上的通信程序很直接,所以当时没有仔细想过TCP的三次握手和四次挥手这个问题,有的时候自己写的时候 会忘掉这个问题,就是为什么会有三次握手的过程和4次挥手的过程 简单来说就一句话 &quo ...

最新文章

  1. ABBYY在MS Office中创建PDF文件的方法
  2. TCP/IP 10.1集成IS-IS协议
  3. 软件开发管理规范流程图
  4. 鲁棒图的三元素:抽象对象,实体对象和控制对象
  5. Pytorch TensorRT
  6. RFID位置数据这么多,企业应该怎么利用?
  7. shiro反序列化工具_Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)源码解析
  8. android 自定义表情包,android基于环信的聊天和表情自定义
  9. selenium headless报错Message: unknown error: failed to wait for extension background page to load
  10. 开源字体不香吗?五款 GitHub 上的爆红字体任君选
  11. jsp和mysql答辩_如何应对JSP连接MySQL数据库问题_网站数据库怎么连接到网页答辩问题...
  12. RAC 特点   character
  13. biee mysql,Linux环境中使用BIEE 连接SQLServer业务数据源的简单示例
  14. 查询手机号码归属地区等信息API接口
  15. 大数据开源框架环境配置(一)——安装VMware
  16. qq说说时间轴php实现,qq空间时间轴PHP实现时间轴函数代码
  17. 根证书、服务器证书、用户证书的区别
  18. 一网打尽!炫酷枪火打击视频+图文+源码!哔哔哔......
  19. Windows Server 2008 R2 自定义桌面 图标
  20. 500万条微博数据来源分析

热门文章

  1. 【电量计芯片】鼎盛合分享手机电量显示电量芯片技术
  2. 分享电音极速版助手APK和源代码
  3. iperf 测试1000M网络 丢包率问题
  4. 做生意赚钱的方法无非是开源节流
  5. Tbox 相关名词总结
  6. wireshark 抓包工具
  7. 盘面,磁道,柱面,扇区
  8. 精品基于NET实现的家电维修保养信息系统
  9. 国内可用的Internet时间同步服务器地址(NTP时间服务器) 好在阿里云提供了7个NTP时间服务器也就是Internet时间同步服务器地址(转)...
  10. android api23及以上版本报Permission Denial异常处理方法