通俗易懂理解TCP协议三次握手和四次挥手及其常见问题
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协议三次握手和四次挥手及其常见问题相关推荐
- TCP协议“三次握手“和“四次挥手“
TCP协议三次握手和四次挥手 为了使数据的传输更为安全,在OSI七层架构的传输层(TCP)定义了需要建立稳定的连接提供安全的交互环境,而三次握手解决了连接的建立. 三次握手过程: 第一次:客户端向服务 ...
- 理解TCP/IP三次握手与四次挥手的正确姿势
为什么80%的码农都做不了架构师?>>> 背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 问题 有时候聊天的过 ...
- TCP协议---三次握手和四次挥手详解 (不看后悔系列)
目录 TCP协议简介 TCP报头 TCP工作原理 科来解码详解 wireshark解码详解 三次握手和四次挥手 数据包的大致结构 你不知道的三次握手 为什么需要有三次握手? 为啥只有三次握手才能确认双 ...
- TCP协议三次握手和四次挥手
(接上文) 3.5传输层协议(TCP/UDP) 传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程 ...
- TCP协议三次握手及四次挥手
文章目录 TCP 三次握手 第一次握手(SYN=1, seq=x) 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1) 第三次握手(ACK=1,ACKnum=y+1) 为什么 ...
- TCP协议——三次握手与四次挥手
TCP协议 是一种面向连接的.可靠的.基于字节流的传输层通信协议.面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接.TCP使用的流量控制协议 ...
- 白话解说TCP/IP协议三次握手和四次挥手
白话解说TCP/IP协议三次握手和四次挥手 1.背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 1.1.问题 有时候聊天的过程中,我的 ...
- 一文搞懂TCP的三次握手和四次挥手
目录 1.三次握手 2.四次挥手 3.11种状态名词解析 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开. 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所 ...
- 为什么有TCP 的三次握手 和 四次挥手
由于我们的设备上的通信程序很直接,所以当时没有仔细想过TCP的三次握手和四次挥手这个问题,有的时候自己写的时候 会忘掉这个问题,就是为什么会有三次握手的过程和4次挥手的过程 简单来说就一句话 &quo ...
最新文章
- ABBYY在MS Office中创建PDF文件的方法
- TCP/IP 10.1集成IS-IS协议
- 软件开发管理规范流程图
- 鲁棒图的三元素:抽象对象,实体对象和控制对象
- Pytorch TensorRT
- RFID位置数据这么多,企业应该怎么利用?
- shiro反序列化工具_Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)源码解析
- android 自定义表情包,android基于环信的聊天和表情自定义
- selenium headless报错Message: unknown error: failed to wait for extension background page to load
- 开源字体不香吗?五款 GitHub 上的爆红字体任君选
- jsp和mysql答辩_如何应对JSP连接MySQL数据库问题_网站数据库怎么连接到网页答辩问题...
- RAC 特点 character
- biee mysql,Linux环境中使用BIEE 连接SQLServer业务数据源的简单示例
- 查询手机号码归属地区等信息API接口
- 大数据开源框架环境配置(一)——安装VMware
- qq说说时间轴php实现,qq空间时间轴PHP实现时间轴函数代码
- 根证书、服务器证书、用户证书的区别
- 一网打尽!炫酷枪火打击视频+图文+源码!哔哔哔......
- Windows Server 2008 R2 自定义桌面 图标
- 500万条微博数据来源分析