| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> TCP三次握手四次挥手(三国版) -> 正文阅读 |
|
[网络协议]TCP三次握手四次挥手(三国版) |
TCP的三次握手四次挥手????????TCP的三次握手和四次挥手不管是我们自己使用还是面试都是需要掌握的,本文先将原理,然后以三国为例讲个小栗子帮助理解。先来一张图: 标志位????????TCP在其协议头中使用大量的标志位或者说1位(bit)布尔域来控制连接状态,一个包中有可以设置多个标志位。 位码即TCP标志位,有6种标示:
Initial Sequence Number(初始序列号)????????ISN:是在建立TCP三次连接的时候,存储在序列号位置中的数字的代称。也就是说,告诉对方我将要开始发送的初始化序列号是多少,两边都要发这个ISN,即TCP三次连接中第一个SYN包和第二个SYN+ACK的包都有这个。 Sequence number(顺序号码)????????seq的初始值在不同系统实现不一样,一般为随时间增长的值。当seq超过4字节存储空间后从0开始。 ????????在某个方向上传输N个字节的数据,序列号就+N,因此seq用于确认在某个方向上传输的字节数。 ????????如果传输的数据字节为0,即只有首部,那序列号还加吗?当syn或fin被置1,序列号也会+1。其他情况(如只有ack)不加。 Acknowledge number(确认号码)????????只有ack标志置1才有效。在TCP交互的整个周期,除了syn包外其他所有包ack都被置1。 ????????ack序列号是上次已经成功收到数据字节序号+1,比如上次成功接收了seq为1000的数据,发送的ack序号为1001,表示我seq1000以前的数据我已经成功接收了,我对序列号1001开始的数据感兴趣。 三次握手????????TCP?是基于链接的,所以在传输数据前需要先建立链接,TCP?在传输上是双工传输,不区分?Client?端与?Server?端,为了便于理解,我们把主动发起建连请求的一端称作?Client?端,把被动建立链接的一端称作?Server?端。 简单理解
详解三次握手????????首先建立链接前需要 Server 端先监听端口,因此 Server 端建立链接前的初始状态就是?LISTEN?状态。Client 端初始状态是CLOSED状态。
此时建连完成,双方随时可以进行数据传输。 为什么要三次握手????????三次握手是为了建立双向的链接。 那么问题来了,两次可以吗?????????Server?端收到?Client?端的?SYN?请求后,发送了?ACK?和?SYN,但是?Client?端不进行回复,导致?Server?端大量的链接处在?SYN_RCVD?状态,进而影响其他正常请求的建连。这也是产生SYN洪水攻击的原因。
什么是 SYN 洪水攻击?????????SYN 洪水(半开连接攻击)是一种拒绝服务 (DDoS) 攻击,旨在耗尽可用服务器资源,致使服务器无法传输合法流量。通过重复发送初始连接请求 (SYN) 数据包,攻击者将可击垮目标服务器计算机上的所有可用端口,导致目标设备在响应合法流量时表现迟钝乃至全无响应。 赤壁之战(起始篇)赤壁之战:孙权、刘备联军抗曹。
????????如果两次握手,刘备没做回应(或者消息被拦截),孙权在27日三更天去打曹操。结果刘备没去,那孙权是不是就完蛋了。 ????????三次握手是为了确保刘备和孙权都准备好了并能保证按照约定时间去偷袭曹操。 四次挥手????????数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。 简单理解
详解四次挥手再来看看?TCP?的断连,如下图所示。
可以看到,服务器结束TCP连接的时间要比客户端早一些。 为什么要等待2MSL时间原因有两个:
赤壁之战(结束篇)赤壁之战:孙权、刘备联军偷袭曹营,战争差不多了。
为什么建立连接是三次握手,关闭连接确是四次挥手呢?无论是建连还是断链,都是需要在两个方向上进行。
????????这就是建连三次握手而断链需要四次的原因。 如果已经建立了连接,但是客户端突然出现故障了怎么办?????????TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。 参考资料 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 8:49:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |