我们都知道TCP连接的建立需要经历三次握手,为什么需要握三次手?握手的过程又是什么样的呢?

在探讨这些问题之前,我们需要先来了解TCP和IP的封装结构。

TCP和IP的封装结构

IP数据包由TCP数据、TCP头部和IP头部组成。其中IP头部和TCP头部分别占用20个字节, TCP头部和TCP数据合称为TCP报文段;TCP报文段和IP头部我们合称为IP数据包。

TCP头部的组成

TCP头部由16位源端口号和16位目的端口号组成(1字节=8位,即2进制中的8个1或者0);接下来是32位的TCP序号,即TCP Sequence number;再接下来是32位的ACK确认序号,上文中提到IP头部和TCP头部分别占用20个字节,TCP序号和ACK序号各占了4个字节,余下字节分别是4位头部长度、6位保留位、6位标志位,16位窗口大小;最后是16位校验和与16位紧急指针。

TCP的6个标志位

TCP的6个标志位依次是URG、ACK、PSH、RST、SYN和FIN。在TCP的头部,这6个标志位会显示为0或者1,如果出现1,表示TCP包含这层标志的属性。

URG表示紧急指针(urgent pointer)的有效标志位,如果该位置为1,则TCP头部的16位紧急指针内容生效;

ACK的标志位为1,表示这是一个确认包,同时意味32位的确认序号生效;

PSH标志位如果为1,则要求TCP立即将TCP数据转送到应用层,不在缓存区做任何停留;

RST标志位在TCP连接关闭时使用,表示连接重置;

SYN在连接建立的过程中使用,表示同步序号用来发起连接;

FIN在TCP连接关闭时使用,表示发送端完成发送任务,准备断开连接。

TCP连接的建立过程

TCP连接的建立过程需经历三个步骤,每一步同时连通发送端与接收端,就像两个人同时握手一样,因此该过程也被大家形象地称为三次握手。

三次握手如何进行?

第一次握手:请求端发出一个SYN段,指明客户打算连接的服务器端口以及初始序号即ISN;TCP的初始序号由TCP自己生成,之后所有TCP的序号都会基于ISN来计算,而我们通过Wireshark之类的软件看到SYN段的TCP序号为0,为方便识别,软件把绝对序号换成了相对序号;

第二次握手:服务端发出包含初始序号的SYN,表示回答,同时将确认序号设定为客户端的ISN+1以对客户的SYN报文进行确认,一个SYN将占用一个序号;

第三次握手:客户必须将确认序号设置为服务器端的ISN+1,以对服务器端的SYN报文进行确认。

经过这三次握手,报文段顺利完成连接的建立。

TCP连接的状态变迁

三次握手的过程中,TCP的状态一直在变化

连接未建立时:双方都处于listen状态;

第一次握手时:请求端准备发起连接的时候,自身端口会变成主动打开的状态(Active Open),此时请求端为SYN_SENT状态,当SYN到达服务器端时,服务端的端口从监听状态进入Passive Open状态(即被动打开状态),此时服务器端为SYN_RCVD状态;

第二次握手时:请求端收到服务器端的SYN、SYN-ACK以后,变成ESTABLISHED状态;

第三次握手时:请求端认为连接已经完成,发出最后的ACK,当服务器端收到ACK以后,也进入ESTABLISHED状态,至此三次握手正式完成。

为什么要进行第三次握手?

在TCP第三次握手过程中,如果服务器发送SYN_ACK,请求端不发出最后的ACK,那么服务端的TCP连接将无法完成。

网络传输经常存在延时情况,在传输过程中,请求端(客户端)发起了SYN的建连请求,服务器端直接创建该连接给客户端,但由于网络传输原因丢失,请求端无法收到服务器端返回的数据包。此时请求端可能设置了超时时间,时间一到就关闭建连请求,并重新发出。如果没有第三次握手告诉服务器端,请求端已经收到服务器端传输的数据,服务器端对请求端的接收情况将一无所知;此外,还有一种情况,服务器端收到了请求端发出的某些失效的请求信息,误认为是有效请求并接收。

以上两种情况就需要第三次握手来进行确认,让请求端和服务器端及时察觉网络等问题导致的建连失败,减少服务器开销和接收失效请求发生的错误情况。

6分钟get三次握手原理

点击扫码☝观看视频吧

tcp三次握手后被马上rst_TCP为什么需要三次握手?相关推荐

  1. 剑三服务器维护后蹲宠刷新吗,剑三宠物开服刷新点合集 重置版除奇遇外宠物刷新点一览...

    除了靠运气摸奇遇来获得宠物以外,还有可以靠获取道具来获取新的宠物方式.但是一般任务物品的获取并不是无限刷新的,任务物品的出现也是有CD的,而且在人多的服务器,为了抢宠物而疯狂蹲点的小伙伴也是不计其数的 ...

  2. 为什么tcp不采用停等协议_为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?...

    看到了一道面试题:"为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?",想想最近也到金三银四了,所以就查阅了相关资料,整理出来了这篇文章 ...

  3. TCP三次握手的思考,为什么要有三次握手

    大家都知道TCP有三次握手的过程,今天我就仔细想了想为什么TCP要有三次握手 先贴一张三次握手的示意图,说明一点是在三次握手中A是在第二次握手后申请缓存资源,B是在第一次握手后申请 其实这个问题就是说 ...

  4. TCP三次握手,如果一、二、三次握手丢失各会发生什么

    如果想要了解TCP三次握手,可以看下我这篇博客 首先我们要简单了解TCP三次握手的目的 确认客户端和服务器的接受和发送能力 确认双方的seq序列号 使双方协商一些参数,比如窗口大小等 第一次握手丢失 ...

  5. 例说图解TCP/IP协议族--TLS篇(1)抓包分析SSL/TLS握手

    SSL是Secure Sockets Layer (安全套接层)的简写,SSL协议是为网络通信提供安全的一种安全协议,继任者为TLS,即 Transport Layer Security传输层安全. ...

  6. websocket服务器响应头,从服务器发送响应握手后,websocket.onopen不会触发

    下面我已详细分享了我的代码.我阅读文档和关于握手的一切.我遵循了文档中提供的所有步骤以及互联网上的众多示例,但仍然存在此问题.奇怪的事情id websocket.onclsose()在我关闭服务器时被 ...

  7. leetcode1509. 三次操作后最大值与最小值的最小差

    给你一个数组 nums ,每次操作你可以选择 nums 中的任意一个元素并将它改成任意值. 请你返回三次操作后, nums 中最大值与最小值的差的最小值. 示例 1: 输入:nums = [5,3,2 ...

  8. js手机号中间部分隐藏****,显示前三位和后四位

    js手机号中间部分隐藏****,显示前三位和后四位 //slice(n,s)从已有数组中截取选择的元素,不会影响原数组.//n,s是数组元素的下标,n是开始截取元素的下标,S是结束截取元素的下标,可以 ...

  9. form表单用butten提交后无反应表单提交三种方式

    form表单用butten提交后无反应&表单提交三种方式 一,表单提交无反应 有时候,我们发现表单提交的butten按钮,根本就没niao用.鼠标都点烂了,也提交不上去.找了半天什么错误也没找 ...

最新文章

  1. 如何用初中知识理解机器学习到底在干什么事情
  2. 访问vue_一起学Vue:访问API(axios)
  3. CentOS ping name or service not known问题解决
  4. Web性能API——帮你分析Web前端性能
  5. React类里面能写的东西
  6. python屏幕文字识别_学会python就是如此任性,15行代码搞定图片文字识别,附源码...
  7. AWS想到办法让Alexa能在毫秒内做出回复
  8. 深度学习:神经网络neural network
  9. 《精通Unix下C语言编程与项目实践》读书笔记(2)
  10. java接口 数据_一步步学习java后台(三)(接口返回数据处理)
  11. python的前端和后端_python是前端还是后端
  12. mac下charles使用教程
  13. 【必备知识】线激光扫描三维成像原理
  14. 利率掉期(利率互换)的解释
  15. c语言 一帮一题目,【精品资料】大学优秀学子风采录.doc
  16. Tomcat使用总结
  17. 2018年看书计划(40本)
  18. 基于Matlab人脸识别签到系统(GUI界面)
  19. 【论文】联邦学习区块链 论文集(三)
  20. Python——学生管理系统

热门文章

  1. 显示器颜色偏灰不鲜明_你离学会后期调色,只差了一块颜色“正确”的摄影显示器...
  2. mysql cst_JDBC与mysql同为CST时区导致数据库时间和客户端时间差13或者14小时
  3. 控制图的绘制步骤_实战!脚手架排布图绘制步骤和技巧讲解!图文展示
  4. java基础自学教程_Java基础自学教程(全套)
  5. 算法学习——枚举之最简真分数
  6. FFmpeg安装(windows环境)
  7. 使用NodeJS将文件或图像上传到服务器
  8. 信息安全学习笔记--CSRF
  9. 基于FFmpeg接收RTSP的ts流
  10. blender国内下载