TCP三次握手、四次握手过程,以及原因分析
#.首先,要明白握手的目的是什么
可以将TCP双向通信的过程,看成两个单向通信过程的组合:一次 “请求连接——确认”操作,可以确保一方做好了发送准备,另一方做好了接收准备,因此可以建议一个单向的连接;一次 “请求关闭——确认”操作,可以确保一方发完了数据希望关闭发送,另一方收到请求关闭接收,最后关闭掉一个单向的连接。在建立连接时,是为了判断双方是否能够正常建立连接,即客户端—>服务端、服务端->客户端两个单向的收发都是正常的。而在关闭连接时,是为了判断双方是否应该关闭连接,即客户端—>服务端、服务端->客户端两个单向的收发是否应该关闭。在握手过程中,每一端自己当然清楚自己这边的状态,关键是从过程中判断对方的状态。
#.一、建立TCP连接:三次握手协议
第一步,客户端向服务端发送请求;服务端收到了客户端请求,因此服务端可以判断:客户端—>服务端单向收发正常。第二步,服务端向客户端发送确认;客户端收到了确认,因此客户端可以判断:服务端正常收到了自己刚才的请求,所以,客户端—>服务端单向收发正常、服务端—>客户端单向收发正常。于是客户端为连接分配相关资源,开始监听端口。第三步,客户端针对刚才收到的包发送确认;服务端收到了这个确认包,因此服务端可以判断:客户端—>服务端单向收发正常、服务端—>客户端单向收发正常于是服务端未连接分配相关资源,开始监听端口。
其实在理想的网络环境下,只需要两次握手就行了,在上面第二步之后,客户端已经知道两个方向收到都是正常的了,它的确可以发送数据了。但问题在于,网络环境并不总是理想的,在第一步客户端发送请求的过程有可能出现发送后迟迟收不到确认包而重发请求,如果之前已经过时的这个请求包真得彻底消散在网络传输中倒也罢了,但有时候它只是因为网络延迟到达服务端比较晚,过了一阵子时间后,可能又到达服务端了。如果这个旧的请求包到达的时间是在正常请求包到达之前,或者是在整个连接关闭之后才到达,那么服务端是无法判断这是过时请求的,服务端会正常发送确认,需要客户端来验明其过期的身份,然后告知服务端。那么,如果是两次握手的话,一旦出现这种情况,服务端在第一步就会为连接分配资源,开始监听端口。但这是个过时的无效请求,客户端会抛弃掉,不会做对应的连接处理,也不会去发送数据。服务端会一直耗费资源傻等着。如果是三次连接的话,多了客户端验证这一步,服务端能判断出这是一个无效请求,因此不会去做对应的资源分配。
二:关闭TCP连接:四次握手协议
为了以防万一,因为最后一个发往服务端B的确认包有可能丢失,等待两个最大报文生命周期是为了尽可能保障服务端能够收到一次确认包,避免服务单始终处在等待关闭发送的状态。分析:一个“最大报文时长”是TCP数据包在网络中存在的最长时间,超过这个时间报文会被丢弃掉。客户端每次在收到服务端的“关闭请求”后开始计时,服务端一旦超时收不到客户端的确认包就会重发请求,而TCP协议中的确认超时时长应该不会超过“最大报文周期”,而重发的网络请求的传输时间也不超过“最大报文周期”,这样正常情况下,重发的请求在两个“最大报文周期”内应该能够到达客户端,客户端每次在收到服务端的“关闭请求”后又会重新开始计时两个“最大报文周期”,又会重复前面的过程。这样,可以很大限度上保障服务端能收到一次确认包。(当然会有收不到的情况,所以应该会有别的超时机制来兜底。)
TCP三次握手、四次握手过程,以及原因分析相关推荐
- TCP三次挥手四次握手(面试总结)
1. 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢? 全双工通信. 这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而 ...
- TCP三次挥手四次握手
三次握手: 客户端发起: 1.向服务器端发送报文SYN=1,ACK=0;客户端进入SYN-SEND状态. 2.服务端收到SYN=1,ACK=0的请求报文,向客户端返回确认报文SYN=1,ACK=1,服 ...
- go tcp客户端自动重连_阿里面试: HTTP、HTTPS、TCP/IP、三次握手四次挥手过程?(附全网最具深度讲解)
前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在阿里面试的时候确实被问到了这个问题,HTTP.HTTPS.TC ...
- TCP三次握手四次挥手过程及其中的状态量
网上看到过一些有关TCP三次握手四次挥手的过程,觉得有必要总结一下了,对于了解TCP的过程还是有帮助的 1.变量含义 SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DAT ...
- TCP/IP详解--TCP/IP中三次握手 四次握手状态分析
TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...
- tcp三次握手四次挥手(及原因)详解
TCP(Transmission Control Protocol,传输控制协议)是 面向连接的协议,也就是说在收发数据之前,必须先和对方建立连接, 一个TCP连接必须要经过三次"对话&qu ...
- 三次握手 四次握手 与socket函数的关系
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠so ...
- 一切皆socket!网络编程:三次握手 四次握手 与socket函数的关系
转载地址:http://www.cnblogs.com/suntp/p/6434644.html 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与w ...
- 随笔 - 58, 文章 - 0, 评论 - 0, 引用 - 0 三次握手 四次握手 与socket函数的关系
1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect()函数 3.4.a ...
- TPC三次握手/四次握手
TCP数据包结构 TCP三次握手 TCP四次挥手
最新文章
- linux 磁盘管理上(分区操作,格式化文件,挂载和卸载)
- 说说 XSRF 防范
- AIRec个性化推荐召回模型调参实战
- 使用Blazor做个简单的时间戳在线转换工具
- 1535C. Unstable String
- 织梦Cms怎么一直服务器维护中,织梦后台搜索关键词维护中出现大量网址信息的处理办法...
- 图森未来C轮融资5500万美元,新浪继续跟投,无人卡车公开试乘
- 基于深度学习检测驾驶员的走神行为
- ubintu yum装mysql_Ubuntu 下安装Mysql centos8 下安装mysql8.0
- pytorch与resnet(六) 预训练模型使用的场景
- UEditor 配置
- vue中引用BScroll监听上拉加载报错
- 第六章 使用 matplotlib 绘制热力图
- hexo next主题去掉码市的Coding Pages等待页
- 字节跳动的产品经理是怎么工作的?
- word一直提示“缓存凭据已到期,无法上载或下载你的更改”问题---登入了两个onedrive账号(一个是个人的,一个是学校教育版的)发现编辑word后,文本无法保存
- pstack工具查看线程堆栈的方法
- 可编程控制器/微机接口及微机应用综合装置
- 物联网平台组成部分CMP、DMP、AEP、BAP
- 当AI入职FBI,克格勃直呼内行
热门文章
- html5 电子白板 直播,基于HTML5的电子白板的设计与实现
- 高级语言是如何运行的——语言的运行方式
- 图表可视化配色学习——自动提取图片主色调与配色方案(python、pillow、haishoku和seaborn),并生成十六进制颜色编码
- Python--pyaudio声卡录音
- 基础呀基础,用二极管防止反接,你学会了吗?
- ffmpeg 为取经而来_孙悟空很早之前就死了,取经的其实是六耳猕猴,这说法是真的吗?...
- 红帽企业linux8,红帽发布企业版 Linux(RHEL) 8.0
- DM13: COSCon19私人回顾
- linux最全网络监控命令梳理及评测
- Cys(Npys)-(Arg)₉,H2N-C(Npys)-RRRRRRRRR-OH