TCP基础
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基础的更多相关文章
- 快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础
上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是W ...
- TCP基础知识
TCP/IP网络协议栈分为应用层(Application).传输层(Transport).网络层(Network)和链路层(Link)四层.如下图所示 两台计算机通过TCP/IP协议通讯的过程如下所示 ...
- TCP基础知识(三)重传、流量控制、拥塞控制
TCP详解(3):重传.流量控制.拥塞控制…… 数据传输 在TCP的数据传送状态,很多重要的机制保证了TCP的可靠性和强壮性.它们包括:使用序号,对收到的TCP报文段进行排序以及检测重复的数据:使用校 ...
- TCP基础概念
定义 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议 特点 TCP是一种面向广域网的通信协议,目的是在跨越多个网 ...
- TCP基础知识 复习
前言 说来惭愧,大二时候学的计算机网络好多都不太记得了,不过还好有认真学过,捡起来也挺快的,就是对于现在业界中使用的网络算法的不是很懂: 1 TCP报文段结构 1.1 序号和确认号 序号,是报文段首字 ...
- 网络编程中TCP基础巩固以及Linux打开的文件过多文件句柄的总结
1.TCP连接(短链接和长连接) 什么是TCP连接?TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. 当网络通信 ...
- TCP 基础知识
参考 朱小厮-一文详解TCP 博客园-"三次握手,四次挥手"你真的懂吗? 博客园-深度解密HTTP通信细节
- TCP基础知识(二)三次握手与四次挥手
TCP详解(2):三次握手与四次挥手 TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接,就好像你 ...
- TCP基础知识(一)简介与数据包
TCP详解(1):简介与数据包 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议 应用层向TCP层发送用于网间传输 ...
随机推荐
- 关于Newtonsoft.json JsonConvert.DeserializeObject反序列化的使用
object obj = JsonConvert.DeserializeObject("{\"Sta\":3}", paramClass); //paramCl ...
- JS学习笔记 - 封装getPosition函数、一串跟着鼠标的div
function getPosition(ev) { var scrollTop = document.documentElement.scrollTop || document.body.scrol ...
- linux cmd cp -a
cp -a 在保留原文件属性的前提下复制文件 cp -r dirname destdir 复制目录后其文件属性会发生变化 想要使得复制之后的目录和原目录完全一样,可以使用cp -a dirn ...
- Instruction-Set Support for Invocation of VMM-Configured Services without VMM Intervention
A processing core comprising instruction execution logic circuitry and register space. The register ...
- [AngularFire 2] Push, remove, update
import { Injectable } from '@angular/core'; import {RealtimeService} from "../shared"; imp ...
- php课程 1-3 字符串变量输出方式有哪些(总结:四种)
php课程 1-3 字符串变量输出方式有哪些(总结:四种) 一.总结 一句话总结:推荐使用双引号中加{$变量名}的形式(echo "my name is {$name}eee !" ...
- 最正经的php post get
https://www.cnblogs.com/ps-blog/p/6732448.html /** * 模拟post进行url请求 * @param string $url * @param str ...
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出.Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存溢出(java.lang.OutOfM ...
- iOS开发:父子控制器简介:
#import "ViewController.h" #import "ScoietyViewController.h" #import "HotVi ...
- Android 获取签名证书的具体信息(Eclipse和Android studio通用)
今天要用到签名证书的MD5,可是这个仅仅有在第一次生成的时候我看到了,这可怎么办呢,幸亏我们有google,我们执行以下的命令就OK了. keytool -list -v -keystore 签名证书 ...