1.基本概念

TCP之所以能够安全的将数据在传输中的安全性,是因为它每次给对方发送数据,都会等待对方给个确认,当长时间收不到这个确认,发送端就会重发这个数据。

2.超时时间的測量

要測超时时间,TCP必须要发送一个特别序号的字节和接收包括该字节的确认之间的RTT,可是,确认本身就是有延时的,所以一般有一种简单的測量超时时间的公式

RTO = RB

当中R为随RTT变化而变化的平滑因子

3.拥塞避免算法

前边的博客有写道,当发送端使用慢启动算法时,因为其发送的数据段呈指数增长,因此也非常easy达到网络通道的极限,此时。网络上的路由就会将部分分组丢失,因此TCP又给发送端设置了一种拥塞算法,此算法就是用来解决分组丢失问题的

拥塞算法假定正常情况下分组的丢失率是非常小的低于(1%)。所以当两方出现大量丢失分组现象,则说明网络出现拥堵

拥塞避免算法和慢启动算法一般结合使用,此时须要给发送端维持俩个变量,一个是拥塞窗体cwnd,和一个慢启动门ssthresh。算法过程详细例如以下

(1)对于一个给定的连接,将初始化cwnd为1,和ssthresh为65535字节

(2)TCP输出的数据不能超过接收方给的通告窗体和拥塞窗体的最小值,拥塞窗体是发送方使用的流量控制。通告窗体是接收仿使用的流量控制

(3)当拥塞发生时(超时或收到反复确认),ssthresh就会被设置为当前窗体的一般。即拥塞和通告窗体的最小值

(4)此时我们先进行慢启动,发送的数据段将呈指数增长,非常快便达到了改动后的ssthresh(窗体的一般)的值。此时慢启动将不在以指数的方式增长发送量了,而是每收到一个确认,则发送量就增长1的线性增长

4.高速重传与高速恢复

当我们收到失序的报文段时。TCP需马上产生一个ACK(一个反复的ACK),这个反复的ACK不应该延迟,该ACK是想让对方知道收到了失序的报文段,并告诉对方希望收到的序号

因为我们并不知道一个反复的ACK是由丢失的报文段引起的还是只由又一次排序所引起的,因此我们就略微等待一下,在做推断。当在又一次排序的报文段被处理并产生一个新的ACK之前只可能收到1-2个反复的ACK,假设收到3个以上的ACK就非常可能是报文段丢失了。于是我们就直接重传丢失的报文段,而无须等待超时定时器的溢出(也就是不须要等到超时时间到了才推断丢了)接下来运行的就是拥塞避免算法。这就是高速恢复。

5.按每条路由进行度量

如今较新的TCP实现的路由表项中维持了很多指标,当一个TCP连接关闭时,假设已经发出了足够多的数据来获得有意义的统计资料。且目的节点的路由表项不是一个默认表项。那么下列信息就保存在在路由表项中使用:平滑的RTT,慢启动门限等

6.又一次分组

当TCP重传时,它不一定要重传相同的报文段。相反TCP同意进行又一次分组。而进行发送一个较大的报文段

最新文章

  1. 《转》Unity3D研究院编辑器之5.3JSON的序列化
  2. 夺命雷公狗-----React---19--表单的值的修改
  3. poj 3070
  4. monkeyrunner之夜神模拟器的安装与使用(二)
  5. Webform——中国省市三级联动以及IsPostBack
  6. Qt之坐标系统
  7. Python OpenCV ——Matplotlib显示图片
  8. java 求第n小的质数
  9. vs2012 condition_variable notify_one 崩溃
  10. Python 学习教程
  11. Entity Framework Code First级联删除
  12. GDI相关基础知识
  13. vs2015开发Windows服务
  14. 关于前后端同构,我的一点思路和心得(vue、nodejs、react、模版、amd)
  15. vue2入门之vue-cli
  16. [翻译] 介绍EF Core
  17. 10_常见的get和post请求_路由器_ejs服务器渲染模板引擎
  18. typeHandler
  19. HDU 4553 约会安排 (区间合并)【线段树】
  20. Linux Shell自动交互/人机交互的三种方法

热门文章

  1. C++ classes and uniform initialization
  2. delphi 消息的使用
  3. DNS服务器
  4. 在ASP.NET MVC中使用Knockout实践01,绑定Json对象
  5. 三张图让你高速明确activity与fragment生命周期的异同点
  6. CentOS安装sctp协议
  7. Mac下启动AndroidStudio失败
  8. ubuntu php 安装
  9. [Web 前端] this作用域问题
  10. 标准输出中stderr和stdout的区别