可靠数据传输原理

如何在一条不可靠的信道上得到可靠的传输?

不可靠的原因:可能出现比特差错、丢包

停等传输下的情况

从简单到难的情况一步步分析:

1.经过完全可靠信道的可靠数据传输

这时只需要一发一收,值得注意的是:发送端的发送动作是由上层(应用层)触发,接收端的接收动作是由下层(网络层)触发

2.经具有比特差错信道的可靠数据传输

既然可能出现比特差错,那首先要能检测出比特差错,这可以用校验和的方法

当接收端检测到比特差错,应该向发送端反馈出错了(NAK),发送端再重新发送直到没有错误(即使无错误也要反馈接受无误(ACK)),注意反馈时也要用到校验和

这里又出现了问题,没有办法保证发送端反馈的信息无差错传输(反馈信息也可能出现错误,表现为校验和错误,不过错误背后的信息即可能是NAK也可能是ACK),因此发送端为了保证万无一失,只要收到的反馈有错误,就重新发送该分组

然然然而,数据运输是许多个分组,一个接着一个,然后想到如果是ACK分组受损,发送端重传分组,会导致接收端错把重传分组当成新分组,所以必须区分一前一后两个分组,这可以通过在分组前增加0/1来解决(0/1对应一前一后)

3.经具有比特差错的丢包信道的可靠数据传输

先考虑丢包的后果,丢包会导致接收端无回应,因此发送端可以选定一个时长,当发送分组在经过此时长后就判定发生丢包,随后重传分组,具体操作是设定一个定时器

流水线传输

上面讨论的传输都是停等传输,即发送端收到一个确定,发送一个分组,要想提高效率,可以允许发送端发送多个分组而无需等待确认,一回合发送多个分组后必须要做的工作有:增加序号范围,缓存多个分组,此外对于如何处理丢失、损坏和超时,有两种方法:

1.回退N步(Go-Back-N,GBN)协议

发送端:维护一个发送窗口,[Send Base,SendBase+N-1],窗口已满时拒绝上层调用,累计确认ACK(序号n),定时器

接收端:按序接受,累计确认,丢弃乱序包并反馈

丢弃一个正确接受的分组的缺点是最后对该分组的重传也许会丢失或出错,因此需要更多的重传

2.选择重传(Selective Repeat,SR)

发送端:每个分组一个单独一个定时器,采用单个确认

接收端:维护一个接收窗口,[rcv_base,rcv_base+N-1],用来缓存失序的分组

收到序号在小于现在 一个窗口大小范围内 的分组,必须产生一个ACK

发送端和接收端的窗口并不总是一致,最大错位一个窗口,所以序号范围有限时,为了避免对一个序号的含义混淆(重传/新分组),窗口长度必须小于或等于序号空间大小的一半

TCP解析

特点:面向连接的(connection-oriented),全双工服务,点对点的

TCP报文段结构

首部一般20字节:源端口号(16bits),目的端口号(16bits),检验和字段(16bits),序号(32bits),确认号(32bits),接收窗口(16bits),首部长度(4bits,以32bits的字为单位),选项(可变长),标志(ACK确认,(RST,SYN,FIN)连接建立与拆除,(CWR,ECE)拥塞报告,PSH(表明应立即将数据交给上层),URG(紧急报文)),紧急数据指针(16bits,配合URG标志使用)

序号和确认号:序号对数据流中的字节编号,确认号表示下一次接收时期望的序号

往返时间(Round-Trip Time,RTT)

往返时间的估计:某个时刻的值SampleRTT,其均值为EstimateRTT

计算公式:EstimateRTT=(1-α)EstimateRTT+αSampleRTT,α的推荐值为0.125

(指数加权移动平均)

偏差的估计:DevRTT=(1-β)DevRTT+β
|SampleRTT-EstimateRTT|

设置和管理重传时间间隔:重传超时间隔TimeoutInterval=EstimateRTT+4*DevRTT,初始值为1s

TCP可靠数据传输

这里指出上节可靠数据传输技术的缺点:定时器的管理需要相当大的开销

拥塞控制的简单方法:超时间隔加倍,初始0.75s

快速重传:3个冗余ACK--->重传

累计确认,缓存失序分组

流量控制(区别于拥塞控制)

为了消除发送方发送太快,使接收方缓存溢出的可能性

方法:维护一个接收窗口变量,表明接收方还有多少可用的缓存空间

TCP连接管理:

三次握手(客户发起)

1.客户主机随机生成序号,SYN标志置为1,发送连接请求

2.服务器随机生成序号,SYN标志置为1,确认号置为客户序号+1,允许连接

3.客户回复序号+1,SYN置为0,确认号为服务器序号+1,连接建立

四次挥手(双方都可发起)

1.一方将FIN标志置为1,请求关闭连接,这一方进入FIN_WAIT_1状态

2.另一方回复ACK,进入CLOSE_WAIT,(发起方收到ACK,进入FIN_WAIT_2)

3.并接着回复FIN=1,进入LAST_ACK

4.初始方收到FIN,回复ACK,进入TIME_WAIT,定时(30s/1min/2min)关闭,(另一方收到ACK,进入CLOSED)

SYN洪泛攻击的应对

服务器以请求连接方的IP和Port为参数使用一个私密的散列函数计算出一个值,使其作为服务器初始序号,并发送SYNACK给请求方,这时并不建立半开连接

如果用户回复ACK,且ACK-1=f(IP,Port),那么说明用户合法,允许建立连接

如果回复的ACK错误,说明此用户并没有较早的SYN请求,是非法的

如果没有回复,也不会产生危害,因为服务器并没有给它分配资源

TCP拥塞控制

加性增,乘性减(Additive-Increase,Multiplicative-Decrease,AIMD)

TCP吞吐量

一条连接的平均吞吐量=0.75W/RTT,W为丢包发生时的窗口长度

经高带宽路径的平均吞吐量=1.22MSS/(RTT*根号L),L为丢包率

AIMD算法公平吗

公平,因为拥塞发生时,原本占带宽大的减少较多的窗口长度,原本占带宽少的减少较少的窗口长度,拥塞避免状态又是以同样速度增加窗口长度,数次拥塞发生后,各连接的窗口长度接近相等,带宽占用趋于平均

TCP协议原理与格式初探的更多相关文章

  1. 简析TCP的三次握手与四次分手(TCP协议头部的格式,数据从应用层发下来,会在每一层都会加上头部信息,进行封装,然后再发送到数据接收端)good

    2014-10-30 分类:理论基础 / 网络开发 阅读(4127) 评论(29)  TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更 ...

  2. 网络编程简介(OSI七层协议,TCP协议原理,三次握手与四次挥手)

    目录 网络编程 软件开发架构 C/S架构 B/S架构 网络编程的发展史 互联网协议 1.物理连接层 2.数据链路层 3.网络层 4.传输层 5.应用层 三次握手四次挥手 三次握手建链接 数据传输 四次 ...

  3. 【转】TCP协议

    TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6.TCP是一 ...

  4. TCP协议的三次握手和四次分手

    HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用. ...

  5. 通俗大白话来理解TCP协议的三次握手和四次断开

    from : https://blog.csdn.net/Neo233/article/details/72866230?locationNum=15&fps=1%20HTTP%E6%8F%A ...

  6. 通俗大白话来理解TCP协议的三次握手和四次分手

    通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手. 引用网上的一些通俗易懂的例子,虽然不太正确,后面会指 ...

  7. 网络编程杂谈之TCP协议

    TCP协议属于网络分层中的传输层,传输层作用的就是建立端口与端口的通信,而其下一层网络层的主要作用是建立"主机到主机"的通信,所以在我们日常进行网络编程时只要确定主机和端口,就能实 ...

  8. TCP 协议简析

    TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的.可靠的.基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接.它是个超级麻烦的协议, ...

  9. TCP协议理解

    一.前言: TCP协议和UDP协议是网络编程里最重要的协议,很多新出的技术.新出的协议本质上都是基于这两个协议的,其中又以TCP协议居多:比如HTTP协议就是基于TCP协议的,应用程序和数据库交互也是 ...

随机推荐

  1. Springboot+Redis(发布订阅模式)跨多服务器实战

    一:redis中发布订阅功能(http://www.redis.cn/commands.html#pubsub) PSUBSCRIBE pattern [pattern -]:订阅一个或者多个符合pa ...

  2. uc浏览器手机版,页面图片不显示

    uc浏览器手机版,有时候上面的轮播广告看不到 原因:uc浏览器会拦截所有带ad的标签 例如: <div id="adDiv"> <img src="/r ...

  3. pyquery 匹配NavigableString

    pyquery 匹配NavigableString不像xpath那样精确找打匹配对象,只需匹配包含NavigableString的根节点

  4. 【C语言】这种求结构体成员大小的方法,你可能需要了解一下~

    在C语言编程中,有时候需要知道某结构体中某成员的大小,比如使用堆内存来存储结构体中的某成员时,需要知道该成员的大小,才好确定所需申请的空间大小.求某结构体中某成员的大小,你会怎么做? 例子: type ...

  5. 扫描仪扫描文件处理-ABBYY自动矫正图像歪斜

    修改界面语言: 设置为不识别图片文字(因为我们只需要把图片歪斜校正): 保存无损彩色格式:

  6. win8怎样才能启用administrator登录 别的用户也是如此

    但是你可以用命令调出administrator账户打开C盘,打开windows文件夹,再打开system32文件夹,找到cmd.exe右键点击选择以管理员身份运行 在里面输入net user admi ...

  7. 第二个 SignalR,可以私聊的聊天室

    一.简介 上一次,我们写了个简单的聊天室,接下来,我们来整一个可以私聊的聊天室. SignalR 官方 API 文档 需求简单分析: 1.私聊功能,那么要记录用户名或用户ID,用于发送消息. 2.怎么 ...

  8. React.Component 和 React.PureComponent 、React.memo 的区别

    一 结论 React.Component 是没有做任何渲染优化的,但凡调用this.setState 就会执行render的刷新操作. React.PureComponent 是继承自Componen ...

  9. 阿里云ECS磁盘扩容不生效处理办法

    原因 阿里云ECS云盘扩容后,在Linux服务器上没有生效 实际需要几条命令扩容才能正式生效. 处理方法 先看扩容前磁盘空间,/dev/vda1可以看到只有40G. # df -Th Filesyst ...

  10. vue项目中mockjs的使用

    mock.js是一个库,源码托管:https://github.com/nuysoft/Mock github上的原话:Mock.js是一个模拟数据生成器,可帮助前端开发和原型与后端进度分开,并减少某 ...