TCP 的三次握手+两次交换+四次挥手
目录
- 1、TCP 的三次握手+两次交换+四次挥手
- 1.1、三次握手
- 1.1.1、流程
- 1.1.2、两次握手为什么不可以?
- 1.1.3、第一次握手是否可以携带数据?
- 1.1.4、第二次握手是否可以携带数据?
- 1.1.5、第三次握手是否可以携带数据?
- 1.1.6、TCP-SYN Flood攻击
- 1.2、二次交换
- 1.3、四次挥手
- 1.3.1、流程
- 1.3.2、为什么建立连接需要三次握手,断开连接需要四次挥手?
- 1.3.3、为什么“客户端”TIME_WAIT 状态需要经过2MSL才能返回到 CLOSE 状态?
首先,“双端”(“客户端”和“服务器端”)建立连接并且申请资源需要完成TCP协议的“三次握手”过程,然后,双端方可进行“数据交换”,最后,“双端”断开连接并且释放资源需要完成TCP 协议的“四次挥手”过程。
1、TCP 的三次握手+两次交换+四次挥手
1.1、三次握手
1.1.1、流程
第一次握手:当“客户端”发出SYN报文后,“客户端”进入SYN_SENT状态,等待“服务器端”的确认。
第二次握手:当“服务器端”收到SYN报文后,“服务器端”发出SYN+ACK报文,并进入SYN_RCVD状态,等待“客户端”的确认。
第三次握手:当“客户端”收到SYN+ACK报文后,“客户端”发出ACK报文,并进入ESTABLISHED状态。当“服务器端”收到ACK报文后,“服务器端”进入ESTABLISHED状态,完成三次握手。
1.1.2、两次握手为什么不可以?
如果“客户端”和“服务器端”只完成两次握手就建立连接,那么在“数据交换”的时候“服务器端”不知道对方(“客户端”)是否具有read能力。
如果“客户端”和“服务器端”只完成两次握手就建立连接,同时,第二次握手报文丢失,后续“客户端”跟“服务器端”的“数据交换”就无法继续下去(“客户端”无法知道“服务器端”传输过来的SYN+ACK报文信息中的初始化Seq序列号,就无法计算得到“客户端”向“服务器端”进行“数据交换”期间的Ack值)。
由于“服务器端”不知道“客户端”是否具有read能力,在完成两次握手就建立连接,那么会加大“服务器端”的安全隐患,比如黑客频繁的发起两次握手,“服务器端”申请资源建立连接导致资源耗尽。
第一次握手SYN报文的Seq值是随机生成的,如果两次握手就建立连接且第二次握手报文丢失,那么“服务器端”无法判断后续的报文对应的连接是否就是历史连接。
1.1.3、第一次握手是否可以携带数据?
第一次握手不可以携带数据。
假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的SYN报文中放入大量的数据,疯狂着重复发SYN报文,这会让服务器花费大量的内存空间来缓存这些报文,这样服务器就更容易被攻击了。
1.1.4、第二次握手是否可以携带数据?
第二次握手不可以携带数据。
1.1.5、第三次握手是否可以携带数据?
第三次握手可以携带数据。
1.1.6、TCP-SYN Flood攻击
TCP-SYN Flood攻击又称半开式连接攻击,是一个计算机编程术语。标准的TCP建立连接,都会经历“三次握手”的过程,而黑客进行TCP-SYN Flood攻击的时候只有前两个步骤,这样“服务器端”会在一定时间处于等待“客户端”的ACK报文。由于一台服务器可用的TCP连接是有限的,如果黑客频繁地发送此类连接请求,则服务器可用TCP连接队列很快将会阻塞,系统资源和可用带宽急剧下降,无法提供正常的网络服务,从而造成拒绝服务。
1.2、二次交换
为了保证数据准确到达,“服务器端”在收到数据包包后必须立即回传ACK包(包括SYN包、FIN包、普通数据包等),这样发送方才能确认数据传输成功。
此时Ack号为1301而不是1201,原因在于Ack号的增量为传输的数据字节数。假设每次Ack号不加传输的字节数,这样虽然可以确认数据包的传输,但无法明确100字节全部正确传递还是丢失了一部分,比如只传递了80字节。因此按如下的公式确认Ack号:
A c k = S e q + 传 递 字 节 数 + 1 Ack=Seq+传递字节数+1 Ack=Seq+传递字节数+1
与三次握手协议相同,最后加1是为了告诉对方要传递的Seq号。
如果“客户端”到“服务器端”的数据包发生丢失,为了完成数据包的重传,“客户端”每次发送数据包时都会启动定时器,如果在一定时间内没有收到“服务器端”传回的ACK数据包,那么定时器超时了,“客户端”数据包会重传。
1.3、四次挥手
1.3.1、流程
第一次挥手:“客户端”发出FIN报文,并进入FIN_WAIT_1状态。
注意:此时,“客户端”不会向“服务器端”进行“数据交换”。
第二次挥手:当“服务器端”收到FIN报文后,“服务器端”发出ACK报文,并进入CLOSE_WAIT状态。当“客户端”收到ACK报文后,“客户端”进入FIN_WAIT_2状态。
注意:此时,如果“服务器端”还要向“客户端”进行“数据交换”,那么“服务器端”继续发送数据。
第三次挥手:当“服务器端”数据发送完毕后,“客户端”发出FIN报文,并进入LAST_ACK状态。
第四次挥手:当“客户端”收到FIN报文后,“客户端”发出ACK报文,并进入TIME_WAIT状态。当“服务器端”收到ACK报文后,“服务器端”进入CLOSED状态,完成四次握手。
注意:此时,“客户端”的TCP连接还没有释放,必须经过2*MSL(maximum segment lifetime)后才进入CLOSED状态。而“服务器端”收到“客户端”的ACK报文后就进入了CLOSED状态,可以看出“服务器端”比“客户端”结束连接的时间早。
1.3.2、为什么建立连接需要三次握手,断开连接需要四次挥手?
三次握手的时候,“服务器端”是将SYN和ACK数据合并到一个报文里面发送的。四次挥手的时候,“服务器端”是将FIN和ACK数据分开到二个报文里面发送的,将这两个报文分开发送的目的是能够保证“服务器端”能够把剩余的数据传输到“客户端”。
1.3.3、为什么“客户端”TIME_WAIT 状态需要经过2MSL才能返回到 CLOSE 状态?
原因1:在“服务器端”发送FIN报文后,“客户端”会发送的ACK报文,但是这个报文可能不可达。如果“服务器端”接收不到“客户端”的ACK报文,那么“服务器端”会重新发送FIN报文。所以“客户端”发送ACK报文后需要留出2MSL时间(ACK到达“服务器端”时间+“服务器端”重传发送FIN包时间)等待服务器收到了ACK报文;
原因2:MSL指的是报文在网络中的最大生存时间,通过2MSL的TIME_WAIT后,可以使本TCP连接“客户端”和“服务器端”产生的所有的报文都从网络中消失,以致避免新旧TCP连接出现冲突。
TCP 的三次握手+两次交换+四次挥手相关推荐
- 三次握手(Three-way Handshake)和四次挥手
相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助. 而且对于有网络协议工程师之类笔试, ...
- TCP的三次握手建立连接和四次握手释放连接
1.socket中TCP的三次握手建立连接详解 我们知道tcp建立连接要进行"三次握手",即交换三个分组.大致流程如下: 客户端向服务器发送一个SYN J 服务器向客户端响应一个S ...
- TCP三次握手建立连接和四次挥手关闭连接
TCP三次握手 是指建立TCP连接协议时,需要在客户端和服务器之间发送三个包,握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据. 第一次握手:客户端发送第一个包,其中S ...
- 三次握手的过程、四次挥手、为什么要进行第三次握手、为什么要进行四次挥手
首先要了解 TCP的标记 ACK就是确认报文,就是我反馈我收到这个报文了 ** ACK就是确认报文,就是我反馈我收到这个报文了,可以看到第一次握手不用确认,因为是第一个,而第二次三次,都要回复确认 第 ...
- 了解TCP协议,IP协议、ICMP协议和ARP协议(TCP报文,TCP的分成管理,TCP与UDP,TCP的三次握手四次挥手原理)
文章目录 了解TCP/IP协议 TCP报文格式 TCP/IP 的分层管理 TCP与UDP TCP的三次握手与四次挥手 为什么要三次握手? 为什么要四次挥手? IP数据包格式 ICMP协议 ICMP协议 ...
- TCP协议——三次握手与四次挥手
TCP协议 是一种面向连接的.可靠的.基于字节流的传输层通信协议.面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接.TCP使用的流量控制协议 ...
- 以女朋友为例讲解 TCP/IP 三次握手与四次挥手
来自:开源中国,作者:Champin 链接:https://my.oschina.net/u/3708120/blog/1581023 背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一 ...
- TCP/IP 三次握手和四次挥手
方案 TCP建立连接为什么是三次握手,而不是两次或四次? TCP,名为传输控制协议,是一种可靠的传输层协议,IP协议号为6. 顺便说一句,原则上任何数据传输都无法确保绝对可靠,三次握手只是确保可靠的基 ...
- 理解TCP/IP三次握手与四次挥手的正确姿势
为什么80%的码农都做不了架构师?>>> 背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 问题 有时候聊天的过 ...
最新文章
- 1578: [Usaco2009 Feb]Stock Market 股票市场
- Cache 工作原理,Cache 一致性,你想知道的都在这里
- 关于Apache虚拟主机的设置
- 构成子网与构成超网的分析
- Spring MVC中@RequestParam和@PathVariable批注之间的区别?
- C++局部变量和全局变量的初始化
- 如何用firebug调试js
- DOM概述 选取文档元素 1
- sed -i 单引号中嵌套双引号_【函数应用】IF函数的多层嵌套
- 动态ip软件win7_IPXE+ISCSI Target安装WIN7
- SpringBoot中级篇-SpringBatch+Oracle配置
- MediaType和文件类型对应关系
- arcgis软件环境安装
- c语言中的矩阵求逆程序,C语言矩阵求逆
- rclone 实现 GoogleDrive 同步至 OneDrive
- 图形学 (-)数学基础
- 手机电视推广优先权让位地面国标?
- 基于Vue+Express+Mysql开发的手机端电影购票系统(附源码)
- 物联网、消费物联网、工业物联网与云计算、大数据服务综合分析报告
- mfc 子窗口 跟随 主窗口