| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> TCP/IP -> 正文阅读 |
|
[网络协议]TCP/IP |
基本认识数据格式? ? TCP头的格式如图,其中标色部分是与tcp连接和断开相关的字段 ?序列号:在建立连接时由计算机生成的随机数作为其初始值。用来解决网络包乱序问题。 ?确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决不丢包的问题。
四元组? ? TCP/IP的四元组可以唯一确定一个连接,他们是:原地址,源端口,目的地之,目的端口。(端口是对应的进程) ? ? 通常一个端口对应的最大连接数为: ? ? ?在IPv4中,客户端IP最多为2^32,客户端的端口最多为2^16,所以最大连接数为2^48。实际上最大连接数远远达不到理论值,主要是一下两点原因:
TCP连接建立——三次握手三次握手的连接过程TCP的连接过程如图所示:? ?? ? ? 最开始服务端处于监听状态(监听对象是端口),客户端开始进行连接请求
? ? 由客户端先发起连接请求,将SYN置一,然后初始化序列号,发送服务端,服务端的ACK置为1,确认应答设置为客户端的序列号+1,并将服务端的SYN设为1,初始化服务端的序列号,在发送给客户端,客户端ACK置1,确认应答填上服务端传来的序列号+1。至此,客户端和服务端的syn和ack都设置为1,序列号和确认应答也都有数值。 三次握手原因1、可以防止旧的重复连接初始化造成混乱 ? ? ?如果历史连接被服务端接受,服务端会放回syn+ack给客户端,客户端可以根据自身的上下文判断这个是否是历史连接(序列号过期或者超时),如果是会发送RST终止这次连接。只有两次的话服务端无法确定这个连接是否是历史链接。 2、同步双方序列号 TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素,它的作用:
可见,序列号在 TCP 连接中占据着非常重要的作用,所以当客户端发送携带「初始序列号」的 SYN 报文的时候,需要服务端回一个 ACK 应答报文,表示客户端的 SYN 报文已被服务端成功接收,那当服务端发送「初始序列号」给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。 3、避免资源浪费 ? ? 如果客户端的请求被阻塞重发,由于没有客户端确认的第三次握手,所以服务端不知道自己的ACK有没有被受到,所以只能每受到一个syn就建立一个连接。 ? ? ?TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。 半连接队列和全连接队列? ?? ? ? ? 正常流程:
?TCP连接的其他问题1、为什么客户端和服务端的初始序列号 ISN 是不相同的 ? ? 如果一个已经失效的连接被重用了,但是该旧连接的历史报文还残留在网络中,如果序列号相同,那么就无法分辨出该报文是不是历史报文,如果历史报文被新的连接接收了,则会产生数据错乱。 所以,每次建立连接前重新初始化一个序列号主要是为了通信双方能够根据序号将不属于本连接的报文段丢弃。 2、初始序列号 ISN 是如何随机产生的? 起始 ISN 是基于时钟的,每4毫秒 + 1。 RFC1948 中提出了一个较好的初始化序列号 ISN 随机生成算法。 ISN = M + F (localhost, localport, remotehost, remoteport) M 是一个计时器,这个计时器每隔 4 毫秒加 1。 3、既然 IP 层会分片,为什么 TCP 层还需要 MSS 呢?
? ? IP层进行分片,保证每片都小于MTU,但是如果一个分片丢失,IP报文的所有分片都得重传,但是IP没有重传机制所以需要TCP负责重传。 ? ??为了达到最佳的传输效能 TCP 协议在建立连接的时候通常要协商双方的 MSS 值,当 TCP 层发现数据超过 MSS 时,则就先会进行分片,当然由它形成的 IP 包的长度也就不会大于 MTU ,自然也就不用 IP 分片了。经过 TCP 层分片后,如果一个 TCP 分片丢失后,进行重发时也是以 MSS 为单位,而不用重传所有的分片,大大增加了重传的效率。 4、什么是 SYN 攻击?如何避免 SYN 攻击? ? ??攻击者短时间伪造不同 IP 地址的 SYN 报文,服务端每接收到一个 SYN 报文,就进入SYN_RCVD 状态,但服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的 ACK 应答,久而久之就会占满服务端的 SYN 接收队列(未连接队列),使得服务器不能为正常用户服务。 避免 SYN 攻击方式一 ? ? SYN_RCVD 状态连接的最大个数,超出处理能时,对新的 SYN 直接回报 RST,丢弃连接: 避免 SYN 攻击方式二 ? ? 上文提到过半连接和全连接队列,如果应用程序过慢,会导致全连接队占满,当收到syn攻击的时候,由于无法就收客户端的ack应答,会导致全连接队列慢慢被应用取走,最后为空。 ? ? ? ?可以使用cookie方式避免syn攻击
TCP连接断开——四次挥手
断开连接需要四次挥手原因
TCP断开的其他问题1、为什么 TIME_WAIT 等待的时间是 2MSL? ? ?? ? ? TIME_WAIT 等待 2 倍的 MSL,比较合理的解释是: 网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。比如如果被动关闭方没有收到断开连接的最后的 ACK 报文,就会触发超时重发 Fin 报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方, 一来一去正好 2 个 MSL。2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间将重新计时。 2、为什么需要 TIME_WAIT 状态? ? ? 需要 TIME-WAIT 状态,主要是两个原因:
1、 防止旧数据包被收到;
? ? 所以,TCP 就设计出了这么一个机制,经过? 2、保证连接正确关闭 ? ? TIME-WAIT 作用是等待足够的时间以确保最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭。 TCP保活机制? ??定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔,发送一个探测报文,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。 如果开启了 TCP 保活,需要考虑以下几种情况:
socket编程中对应的TCP三次握手: |
|
网络协议 最新文章 |
使用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/25 17:21:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |