#.首先,要明白握手的目的是什么

可以将TCP双向通信的过程,看成两个单向通信过程的组合:
一次 “请求连接——确认”操作,可以确保一方做好了发送准备,另一方做好了接收准备,因此可以建议一个单向的连接;
一次 “请求关闭——确认”操作,可以确保一方发完了数据希望关闭发送,另一方收到请求关闭接收,最后关闭掉一个单向的连接。
    
        在建立连接时,是为了判断双方是否能够正常建立连接,即客户端—>服务端、服务端->客户端两个单向的收发都是正常的。
        而在关闭连接时,是为了判断双方是否应该关闭连接,即客户端—>服务端、服务端->客户端两个单向的收发是否应该关闭。
在握手过程中,每一端自己当然清楚自己这边的状态,关键是从过程中判断对方的状态。

#.一、建立TCP连接:三次握手协议

客户端:我要对你讲话,你能听到吗;
服务端:我能听到;而且我也要对你讲话,你能听到吗;
客户端:我也能听到。
…….
互相开始通话
……..    
##.过程分析:
第一步,客户端向服务端发送请求;
服务端收到了客户端请求,因此服务端可以判断:客户端—>服务端单向收发正常。
第二步,服务端向客户端发送确认;
客户端收到了确认,因此客户端可以判断:
服务端正常收到了自己刚才的请求,所以,客户端—>服务端单向收发正常、服务端—>客户端单向收发正常
于是客户端为连接分配相关资源,开始监听端口。     
第三步,客户端针对刚才收到的包发送确认;
服务端收到了这个确认包,因此服务端可以判断:客户端—>服务端单向收发正常、服务端—>客户端单向收发正常     
于是服务端未连接分配相关资源,开始监听端口。
为何要分三步握手,而不能是两步握手?
其实在理想的网络环境下,只需要两次握手就行了,在上面第二步之后,客户端已经知道两个方向收到都是正常的了,它的确可以发送数据了。
但问题在于,网络环境并不总是理想的,在第一步客户端发送请求的过程有可能出现发送后迟迟收不到确认包而重发请求,如果之前已经过时的这个请求包真得彻底消散在网络传输中倒也罢了,但有时候它只是因为网络延迟到达服务端比较晚,过了一阵子时间后,可能又到达服务端了。如果这个旧的请求包到达的时间是在正常请求包到达之前,或者是在整个连接关闭之后才到达,那么服务端是无法判断这是过时请求的,服务端会正常发送确认,需要客户端来验明其过期的身份,然后告知服务端。
那么,如果是两次握手的话,一旦出现这种情况,服务端在第一步就会为连接分配资源,开始监听端口。但这是个过时的无效请求,客户端会抛弃掉,不会做对应的连接处理,也不会去发送数据。服务端会一直耗费资源傻等着。
如果是三次连接的话,多了客户端验证这一步,服务端能判断出这是一个无效请求,因此不会去做对应的资源分配。
SYN:该字段被设置为1(即true),表示请求建立连接
FIN:该字段被设置为1(即true),表示请求关闭连接
seq:该字段为请求序列号,譬如为seq=x, 能够标示一个请求包,在众多包种区分其身份
ack:该字段为确认字段,譬如ack=x+1,表示已经收到对方发来的seq=x的请求包。
客户端通过ack可以判断,当前确认包是针对哪个请求包在做确认。

二:关闭TCP连接:四次握手协议

客户端:我说完了,我要闭嘴了;
服务端:我收到请求,我要闭耳朵了;
(客户端收到这个确认,于是安心地闭嘴了。)
…….
服务端还没倾诉完自己的故事,于是继续唠唠叨叨向客户端说了半天,直到说完为止
…….
服务端:我说完了,我也要闭嘴了;
客户端:我收到请求,我要闭耳朵了;(事实上,客户端为了保证这个确认包成功送达,等待了两个最大报文生命周期后,才闭上耳朵。)
(服务端收到这个确认,于是安心地闭嘴了。)
(发送方之所以要收到确认后才关闭发送,是怕接收方没收到自己的请求,避免自己关闭了发送,而接收方还一直傻等着去接收。)
##.客户端收到请求包后,为什么要等待两个最大报文生命周期后,才闭上耳朵呢?
为了以防万一,因为最后一个发往服务端B的确认包有可能丢失,等待两个最大报文生命周期是为了尽可能保障服务端能够收到一次确认包,避免服务单始终处在等待关闭发送的状态。
分析:
一个“最大报文时长”是TCP数据包在网络中存在的最长时间,超过这个时间报文会被丢弃掉。
客户端每次在收到服务端的“关闭请求”后开始计时,服务端一旦超时收不到客户端的确认包就会重发请求,而TCP协议中的确认超时时长应该不会超过“最大报文周期”,而重发的网络请求的传输时间也不超过“最大报文周期”,这样正常情况下,重发的请求在两个“最大报文周期”内应该能够到达客户端,客户端每次在收到服务端的“关闭请求”后又会重新开始计时两个“最大报文周期”,又会重复前面的过程。
这样,可以很大限度上保障服务端能收到一次确认包。(当然会有收不到的情况,所以应该会有别的超时机制来兜底。)
(声明:个别图片来自网络,此处仅用于学习分享,侵删!)

TCP三次握手、四次握手过程,以及原因分析相关推荐

  1. TCP三次挥手四次握手(面试总结)

    1. 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢? 全双工通信. 这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而 ...

  2. TCP三次挥手四次握手

    三次握手: 客户端发起: 1.向服务器端发送报文SYN=1,ACK=0;客户端进入SYN-SEND状态. 2.服务端收到SYN=1,ACK=0的请求报文,向客户端返回确认报文SYN=1,ACK=1,服 ...

  3. go tcp客户端自动重连_阿里面试: HTTP、HTTPS、TCP/IP、三次握手四次挥手过程?(附全网最具深度讲解)

    前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在阿里面试的时候确实被问到了这个问题,HTTP.HTTPS.TC ...

  4. TCP三次握手四次挥手过程及其中的状态量

    网上看到过一些有关TCP三次握手四次挥手的过程,觉得有必要总结一下了,对于了解TCP的过程还是有帮助的 1.变量含义 SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DAT ...

  5. TCP/IP详解--TCP/IP中三次握手 四次握手状态分析

    TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...

  6. tcp三次握手四次挥手(及原因)详解

    TCP(Transmission Control Protocol,传输控制协议)是 面向连接的协议,也就是说在收发数据之前,必须先和对方建立连接, 一个TCP连接必须要经过三次"对话&qu ...

  7. 三次握手 四次握手 与socket函数的关系

    我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠so ...

  8. 一切皆socket!网络编程:三次握手 四次握手 与socket函数的关系

    转载地址:http://www.cnblogs.com/suntp/p/6434644.html 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与w ...

  9. 随笔 - 58, 文章 - 0, 评论 - 0, 引用 - 0 三次握手 四次握手 与socket函数的关系

    1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect()函数 3.4.a ...

  10. TPC三次握手/四次握手

    TCP数据包结构 TCP三次握手 TCP四次挥手

最新文章

  1. linux 磁盘管理上(分区操作,格式化文件,挂载和卸载)
  2. 说说 XSRF 防范
  3. AIRec个性化推荐召回模型调参实战
  4. 使用Blazor做个简单的时间戳在线转换工具
  5. 1535C. Unstable String
  6. 织梦Cms怎么一直服务器维护中,织梦后台搜索关键词维护中出现大量网址信息的处理办法...
  7. 图森未来C轮融资5500万美元,新浪继续跟投,无人卡车公开试乘
  8. 基于深度学习检测驾驶员的走神行为
  9. ubintu yum装mysql_Ubuntu 下安装Mysql centos8 下安装mysql8.0
  10. pytorch与resnet(六) 预训练模型使用的场景
  11. UEditor 配置
  12. vue中引用BScroll监听上拉加载报错
  13. 第六章 使用 matplotlib 绘制热力图
  14. hexo next主题去掉码市的Coding Pages等待页
  15. 字节跳动的产品经理是怎么工作的?
  16. word一直提示“缓存凭据已到期,无法上载或下载你的更改”问题---登入了两个onedrive账号(一个是个人的,一个是学校教育版的)发现编辑word后,文本无法保存
  17. pstack工具查看线程堆栈的方法
  18. 可编程控制器/微机接口及微机应用综合装置
  19. 物联网平台组成部分CMP、DMP、AEP、BAP
  20. 当AI入职FBI,克格勃直呼内行

热门文章

  1. html5 电子白板 直播,基于HTML5的电子白板的设计与实现
  2. 高级语言是如何运行的——语言的运行方式
  3. 图表可视化配色学习——自动提取图片主色调与配色方案(python、pillow、haishoku和seaborn),并生成十六进制颜色编码
  4. Python--pyaudio声卡录音
  5. 基础呀基础,用二极管防止反接,你学会了吗?
  6. ffmpeg 为取经而来_孙悟空很早之前就死了,取经的其实是六耳猕猴,这说法是真的吗?...
  7. 红帽企业linux8,红帽发布企业版 Linux(RHEL) 8.0
  8. DM13: COSCon19私人回顾
  9. linux最全网络监控命令梳理及评测
  10. Cys(Npys)-(Arg)₉,H2N-C(Npys)-RRRRRRRRR-OH