TCP基础知识 复习
前言
说来惭愧,大二时候学的计算机网络好多都不太记得了,不过还好有认真学过,捡起来也挺快的,就是对于现在业界中使用的网络算法的不是很懂;
1 TCP报文段结构

1.1 序号和确认号
序号,是报文段首字节的字节流编号;
确认号,是发送端期望从接收端收到的下一个字节的序号;
TCP只接受数据流中国至第一个丢失字节为止的字节,所以TCP被称为累积确认;
2 可靠数据传输
怎么样才能算是对数据进行可靠传输呢?这就要求确保一个进程从其接收缓存中读出 非损坏的、无间隔的、非冗余的、按序的数据流;
2.1 重传
如果发生超时的现象,则TCP通过重传引起超时的报文段来响应超时事件,再重启定时器,每次重传都会将下一次的超时间隔设为先前值的两倍;
因为发送方经常连续发送大量的报文段,所以如果一个报文段丢失,就很可能引起许多一个接着一个的冗余ACK,如果TCP发送方接收到相同数据的3个冗余ACK,TCP就执行快速重传,即在报文段的定时器过期之前重传丢失的报文段;
2.2 选择确认
- TCP接收方有选择的确认失序报文段(会将正确接收但失序的报文段缓存起来),而不是累计的确认最后一个正确接收的有序的报文段;
3 流量控制
流量控制服务是为了消除发送方使接受方缓存溢出的可能性,因为有可能应用程序读取数据时相当缓慢,而发送方发送数据太多、太快,会很容易造成该连接的接受缓存溢出;
3.1 滑动窗口
接收窗口用于告诉发送方,该接受方还有多少可用的缓存空间;因为TCP是全双工通信,在连接两端的发送方都各自维护一个接受窗口;

- 窗口左边沿向右边移动时称为窗口合拢,这种现象发生在数据被发送和确认时,如果左边到达右边的时候,则认为其是一个零窗口,此时发送方不能够发送任何数据;
- 窗口右边沿向右边移动时称为窗口张开,则允许发送更多的数据,这种现象发生在另一端的接收进程读取已经确认的数据后释放掉TCP的接收缓存;
- 窗口右边向左边移动时称为窗口收缩,如果接收到一个指示窗口左边沿向左移动的ACK,则他被认为是一个重复ACK,并被丢弃;
例子1:

窗口大小为6,窗口向右移动;
例子2:
设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口是 rwnd = 400 ”(这里的 rwnd 表示 receiver window) 。假设每一个报文段为100字节长,而数据报文段序号的初始值设为1。大写ACK表示首部中的确认位ACK,小写ack表示确认字段的值ack。

上面的图中经历了三次流量控制;
- 发送方的发送窗口不能超过接收方给出的接收窗口的数值(TCP的窗口单位是字节,不是报文段)
- 只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就周期性的发送一个零窗口探测报文段(仅仅携带1个字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值;
- 持续计时器的出现是为了解决这么一种特殊的情况:接收方若没有缓存足够使用,就会发送零窗口大小的报文,此时发送放将发送窗口设置为0,停止发送数据。之后接收方有足够的缓存,发送了非零窗口大小的报文,但是这个报文在中途丢失的,那么发送方的发送窗口就一直为零导致死锁。
4 连接管理
略
4.1 三次握手
4.2 四次挥手
5 拥塞控制
拥塞发生的主要原因是因为网络能够提供的资源不足以满足用户的需求,这些资源包括缓存空间、链路带宽容量和中间节点的处理能力。
TCP的拥塞退避由4个核心的算法组成:慢启动、拥塞避免、快速重传和快速恢复;
5.1 慢启动
从小到大逐渐指数增加拥塞窗口的大小;
5.2 拥塞避免
如果超过某个阀值后,慢启动则结束,进入到拥塞避免阶段;拥塞避免的思想就是将指数增加转变为线性增加,这样就可以避免增长过快而导致网络阻塞,慢慢的增加调整到网络的最佳值;
如果当前的cwnd达到慢启动的阈值,则试探性的发送一个segment,如果服务器没有响应,TCP认为网络能力下降,必须降低慢启动阈值,同时为了避免形式继续恶化,有可能将窗口降低为1
5.3 快速重传
快速重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置重传计时器时间到期。
除了经典的三次ACK,还包括ER、FACK,以及最新的基于时间序的RACK的包丢失快速重传算法,做出了很多改良。
5.4 快速恢复
在经历过快速重传后,如果依然接收到重复的ACK,说明网络没有阻塞,这里并不会进入到慢启动的状态,而是直接进入到拥塞避免的状态;

5.5 其它

- 基于丢包反馈:通过ACK所带回来的丢包信息来调整源端的拥塞窗口;
- 基于路径延时反馈:RTT相对于丢包信息反应更加灵敏,更能及时反映出一般网络的拥塞情况,适用于小缓存的中间节点,效率较理想。但是对于路由器经常缓存数据促使RTT延长调节拥塞窗口,实际上没有发生拥塞情况。
- 基于显示拥塞反馈:典型的ECN利用中间节点自己检测本身的拥塞状态,如路由器的反馈状态,直接反馈给TCP源端,以此调节源端的窗口值和发送速率。
TCP基础知识 复习的更多相关文章
- spring 基础知识复习
spring是一个分层架构,由 7 个定义良好的模块组成.Spring 模块构建在核心容器之上,核心容器定义了创建.配置和管理 bean 的方式. 组成spring框架的每个模块(或组件)都可单独存在 ...
- JavaScript进阶【三】JavaScript面向对象的基础知识复习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ZYNQ笔记(0):C语言基础知识复习
ZYNQ的SDK是用C语言进行开发的,C语言可以说是当今理工类大学生的必备技能.我本科学C语言时就是对付考试而已,导致现在学ZYNQ是一脸懵逼.现在特开一帖,整理一下C语言的基础知识. 一.定义 1. ...
- TCP基础知识
TCP/IP网络协议栈分为应用层(Application).传输层(Transport).网络层(Network)和链路层(Link)四层.如下图所示 两台计算机通过TCP/IP协议通讯的过程如下所示 ...
- TCP基础知识(三)重传、流量控制、拥塞控制
TCP详解(3):重传.流量控制.拥塞控制…… 数据传输 在TCP的数据传送状态,很多重要的机制保证了TCP的可靠性和强壮性.它们包括:使用序号,对收到的TCP报文段进行排序以及检测重复的数据:使用校 ...
- MySQL数据库基础知识复习
现在是2020年寒假,这也是新年写的第一篇博客,用了十几天的时间自学了数据库基础部分,想总结一下得失同时并通过写博客来复习前面学的知识点. 个人: 1.本来是计划一周学完基础部分的178p但没能完成这 ...
- C++ 基础知识复习(六)
操作系统部分: 79. 操作系统的最小调度单位:线程. 线程thread,进程process.一个进程至少包含一个线程,主线程,main thread. 80. 资源的最小单位是:进程. 81. 进程 ...
- TCP 基础知识
参考 朱小厮-一文详解TCP 博客园-"三次握手,四次挥手"你真的懂吗? 博客园-深度解密HTTP通信细节
- TCP基础知识(二)三次握手与四次挥手
TCP详解(2):三次握手与四次挥手 TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接,就好像你 ...
随机推荐
- 关于echarts的一些基本使用demo
最近发现一个很好用的一个前端控件echarts,效果非常不错,兼容ie8+以上等主流浏览器.可以使用它制作报表,地图示意图等,可用其实现一系列强大的功能. 其基于html5 Canvas,是一个纯Ja ...
- 快速排序算法javascript实现
function quicksort(arr){ function q(start,end){ if(start>=end){return;} var pivot = start, temp = ...
- Ubuntu16.04下搭建LAMP环境
前期准备sudo apt-get update # 获取最新资源包sudo apt-get upgrade # 本机软件全部更新sudo apt-get d ...
- CSS3形变——transform与transform-origin画时钟
css3属性transform和transform-origin"画"时钟 效果图 前言 八哥:哈喽,大家好!好攻城狮就是我就是你们的小八,欢迎收听你的月亮...哦不,是很高兴与你 ...
- 微信小程序入门之构建一个简单TODOS应用
最近开始了解微信小程序,虽然小程序已经出了很久了,刚出的那段时间很火,看到很多关于小程序的技术文章,不过现在似乎没那么火了,anyway,我们还是可以学习下的. 一.了解微信小程序 1.理念:小程序开 ...
- node.js异步控制流程 回调,事件,promise和async/await
写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. ...
- OpenvSwitch Port Mirror in OpenStack Neutron
前言 最近使用搭建了一个基于VXLAN的OpenStack 环境,发现要去dump ovs interfaces的包其实还是蛮麻烦的, 经过多番努力,找到了如下的在openstack下网络环境的一些t ...
- html中submit和button的区别(总结) [ 转自欣步同学 ]
html中submit和button的区别(总结) submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了. 如果表单在点击提交按钮后需要用JS进行处理(包括输入验证 ...
- Spring Data JPA 简单查询--接口方法
一.接口方法整理速查 下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.( ...
- 机器学习基石 1 The Learning Problem
机器学习基石 1 The Learning Problem Introduction 什么是机器学习 机器学习是计算机通过数据和计算获得一定技巧的过程. 为什么需要机器学习 1 人无法获取数据或者数据 ...