| |
|
开发:
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是一种面向连接的传输层协议。在无连接的IP业务中实现面向连接,需要实现:
对于1、3而言,TCP使用3-WAY握手、4-WAY挥手机制建立和拆除连接。对于2,TCP采用序列号和确认来确保信息的按顺序完整送达。而且使用了拥塞避免的方法,尽可能匹配发送方和接收方的速率。 TCP头部首先介绍一下TCP的头部,TCP的标准头部由20字节构成:
TCP连接建立和拆除TCP 3-WAY握手
TCP 4-WAY 挥手
TCP可靠传输TCP通过3次握手建立连接,4次挥手拆除连接,并通过以下3个机制保障传输的可靠性。这3个机制是:
缓存区与窗口SBUFF和RBUFF可以看作一个环形FIFO队列。在发送端,发送程序把字节按顺序推入SBUFF指针所在位置,TCP从SWND首部取出字节封装发送;在接收端,TCP把接收到的字节推入RWND尾部,接收程序从RBUFF指针处取出字节。以下以发送端发送“HELLOHOWAREYOU”为例子介绍TCP发送和接收缓存。假设MSS(最大数据段尺寸)= 1 Byte,即每个数据段携带1个字节。 发送缓存SBUFF和发送窗口SWNDSWND是在SBUFF内定义的一个区域。SWND的作用是保留尚未确认的字节准备重发。发送端TCP维护3个指针值,包括SWND首部、SWND尾部、SBUFF指针。SWND内的字节已经或正在发送,但未收到确认的字节;从SWND右侧到SBUFF指针的字节是应用程序推入SBUFF等待发送的字节。
接收缓存RBUFF和接收窗口RWND同样,RWND是RBUFF的一个区域。RWND作用主要有两个:拥塞通知和排序。接收端TCP维护3个指针值,包括RBUFF指针值,RWND首部,RWND尾部。RWND首部记录着第一个未收到字节序列号的下一位,RWND尾部记录着从RBUFF指针到RWND首部的字节是缓存区等待TCP送往接收程序的字节;RWND内的字节是等待排序并发送确认的字节。
一般情况下,只有当接收缓存区满了以后,tcp才一次性提交所有数据到应用层。例外情况是接收到psh字段置1的数据段,这要求tcp立即提交缓存区所有数据。但目前很多实现都不会等到缓存区满才进行提交,而是有则提交,因此该标志用途较少。 TCP确认机制TCP是面向字节的,采用连续ARQ确认机制,由接收方对收到的字节进行确认,确保传输的完整性。 对于SWND内没有发送的字节,TCP设定重传计时器,然后一次性发送完,然后进行下一步操作:
接收端需要对接收的所有字节进行确认,但不需要对每一个字节都发送一次确认消息。根据连续ARQ要求,当发送方收到一个字节的确认,即可认为该字节本身和其之前的字节都已经被完整接收;接收端也不需要立即确认收到的字节,RFC建议可延迟不超过0.5s。 拥塞窗口(CWND)接收窗口余量变小,一是发送端发送速度过快,接收端性能不足;二是由于RWND没完成排序。第一种情况下,接收端一方面在发送确认时,把当前RWND余量作为CWND发送给发送端,由发送端调整使得SWND不大于CWND;另一方面将丢弃新接收的字节,由发送端重传定时器超时后重新发送,并启用慢启动。第二种情况下,接收端在收到非等待字节时立即发送等待字节的确认,发送端收到3个同样的确认后启动快重传和快恢复。 TCP拥塞控制TCP对传输的控制体现在每流和全局两个方面。通过校验码,序列号和确认,TCP确保每流的成功传输。通过拥塞控制,TCP确保在传输路径上的整体效率最大化。 拥塞控制主要实施在发送端,通过2个值和4个机制实现。2个值分别是拥塞窗口CWND,慢启动阈值SSTHRESH;4个机制分别是:慢启动,拥塞避免,快重传,快恢复。以下说明的单位是数据段字节数。 慢启动发送端在开始发送数据前,首先设置CWND为1,接着按照以下规则计算CWND: 若CWND<SSTHRESH,则每收到1个连续数据段的ACK,CWND+1; 若CWDN>SSTHRESH,则每收到CWND内所有数据段的ACK时,CWND+1。 在CWND<SSTHRESH之前CWND以指数增长,TCP迅速提高发送速率;在CWND>=SSTHRESH,CWND以线性增长,缓慢提高发送速率。 拥塞避免当重传计时器超时时,发送端设置SSTHRESH=CWND/2,CWND=1 发送端的数据段无法送达或者接收端的ACK无法返回,使发送端TCP认为网络出现了拥塞。这时发送端TCP重新开始慢启动,并更早使CWND进入线性增长。 快重传当接收端收到了一个非等待的字节时,将立即向发送端发送一个确认,ACK为所等待字节的下一个序列号,请求发送端发送丢失的字节。如果接下来的字节仍然不是所期待的字节,接收端将继续发送相同的确认。 快恢复当发送端收到3个确认,ACK均为发送窗口的首部Seq,将认为该数据段已经在网络中丢失。发送端将:
由于CWND并没有像拥塞避免一样重新开始慢启动,发送速度只是减半。而且CWND=SSTHRESH,其增长速度为线性增加,降低了网络拥塞的可能性。 全局同步TCP的拥塞控制虽然单独看起来很完善,但在全局应用中会有很大问题,这就是全局同步(Global Synchronization)。全局同步的含义是,多个TCP流同时慢启动,又同时拥塞避免。 假设在T=0时,一个终端同时对另一个终端发起10个TCP连接。这里不考虑TCP、IP头部消耗,SSTHREST、RWND足够大,MSS=1KB,网络带宽为80KB/s,RTT=2s,重传计时器也是1s。 T=1,CWND均为1,每个TCP流占用1KB/s,流量=10KB/s; T=2,CWND均为2,每个TCP流占用2KB/s,流量=20KB/s; T=3,CWND均为4,每个TCP流占用4KB/s,流量=40KB/s; T=4,CWND均为8,每个TCP流占用8KB/s,流量=80KB/s; T=5,CWND均为16,每个TCP流占用16KB/s,流量=160KB/s。但带宽只有80KB/s,出现了拥塞。这意味着50%包要被丢弃。这只能由TCP发送端重传计时器超时后重新发送。这里假设所有TCP流都有数据段被丢弃,即所有TCP连接均需要重传。根据拥塞避免,所有TCP流的CWND重置为1。因此: T=6,CWND均为1,每个TCP流占用1KB/s,流量=10KB/s; T=7,CWND均为2,每个TCP流占用2KB/s,流量=20KB/s; T=8,CWND均为4,每个TCP流占用4KB/s,流量=40KB/s; T=9,CWND均为8,每个TCP流占用8KB/s,流量=80KB/s; T=10,CWND均为16,每个TCP流占用16KB/s,流量=160KB/s。再一次发生拥塞避免。这个过程将一直循环。 可以看到,全局同步很大程度上将影响网络的传输效率。超过1半时间,网络的利用率都低于50%,还有一些时间网络过载。 目前较为合理应对全局同步的方式,就是在网络中部署RED(随机早期检测/随机早期丢弃),在每个TCP流接近链路总带宽的百分比时,随机丢弃该流的部分数据段。这样可以使TCP进入快重传和快恢复,提早进入线性增长,控制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/26 9:56:56- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |