TCP协议原理与格式初探
可靠数据传输原理
如何在一条不可靠的信道上得到可靠的传输?
不可靠的原因:可能出现比特差错、丢包
停等传输下的情况
从简单到难的情况一步步分析:
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协议原理与格式初探的更多相关文章
- 简析TCP的三次握手与四次分手(TCP协议头部的格式,数据从应用层发下来,会在每一层都会加上头部信息,进行封装,然后再发送到数据接收端)good
2014-10-30 分类:理论基础 / 网络开发 阅读(4127) 评论(29) TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更 ...
- 网络编程简介(OSI七层协议,TCP协议原理,三次握手与四次挥手)
目录 网络编程 软件开发架构 C/S架构 B/S架构 网络编程的发展史 互联网协议 1.物理连接层 2.数据链路层 3.网络层 4.传输层 5.应用层 三次握手四次挥手 三次握手建链接 数据传输 四次 ...
- 【转】TCP协议
TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6.TCP是一 ...
- TCP协议的三次握手和四次分手
HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用. ...
- 通俗大白话来理解TCP协议的三次握手和四次断开
from : https://blog.csdn.net/Neo233/article/details/72866230?locationNum=15&fps=1%20HTTP%E6%8F%A ...
- 通俗大白话来理解TCP协议的三次握手和四次分手
通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手. 引用网上的一些通俗易懂的例子,虽然不太正确,后面会指 ...
- 网络编程杂谈之TCP协议
TCP协议属于网络分层中的传输层,传输层作用的就是建立端口与端口的通信,而其下一层网络层的主要作用是建立"主机到主机"的通信,所以在我们日常进行网络编程时只要确定主机和端口,就能实 ...
- TCP 协议简析
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的.可靠的.基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接.它是个超级麻烦的协议, ...
- TCP协议理解
一.前言: TCP协议和UDP协议是网络编程里最重要的协议,很多新出的技术.新出的协议本质上都是基于这两个协议的,其中又以TCP协议居多:比如HTTP协议就是基于TCP协议的,应用程序和数据库交互也是 ...
随机推荐
- MeteoInfoLab脚本示例:加载图片和透明图层
MeteoInfoLab的georead函数提供了读取shape文件.image文件(JPG.PNG等,需要有相应的地理定位文件)文件生成图层的功能(事实上shaperead也是同样的功能,不过函数名 ...
- centos8平台使用loginctl管理登录用户与session
一,loginctl的用途: 控制 systemd 登录管理器 管理当前登录的用户和session 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/a ...
- 子网划分和VLAN
子网划分 IP地址的结构和分类 根据tcp/ip协议,连接在Internet上的每个设备都必须有一个IP地址,它是一个32位二进制数,为了方便人类识别,我们将它用点分十进制表示,每8位分为一段. IP ...
- 4.QOpenGLWidget-对三角形进行纹理贴图、纹理叠加
在上章3.QOpenGLWidget-通过着色器来渲染渐变三角形,我们为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像.但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多 ...
- 【Azure微服务 Service Fabric 】如何转移Service Fabric集群中的种子节点(Seed Node)
注意:在对Service Fabric的节点做操作之前,请务必确认是否是种子节点(Seed Node)且当前节点的数量是否与SF的持久层要求的数量一致. 可靠性级别是 Service Fabric 群 ...
- zabbix自定义脚本监控服务器端口状态
zabbix可以通过客户端的[net.tcp.port[<ip>,port]]该item监控项来判断本地/远程服务器TCP端口是否正常,不过当时没有想起来,就用了自定义脚本去写的,很久没有 ...
- .net core autofac asyncinterceptor 异步拦截器帮助包
autofac使用拦截器实现AOP,是基于Castle.Core的.然而Castle.Core并未提供原生异步支持.所以需要使用帮助类实现,这在autofac官方文档的已知问题中有详细说明: http ...
- rpc服务在游戏中的简单运用
我们最开始做的游戏框架,多数都是client->server->db的模式,但是随着玩家数量的增加,一个server进程就会扛不住,需要多个进程服务于多个玩家.但是给定了不同进程的玩家,有 ...
- Messenger实现进程间通信(IPC)
messenger内部也是实现aidl通信,所以可以看做一个轻量级aidl,但相对比较简单.首先开启一个服务并实现一个Handler用来处理消息,在onbind方法中返回IBinder对象,通过Ser ...
- localStorage.getItem得到的是[object Object] 的解决方案
设计背景: 购物车要实现本地存储,避免刷新页面数据丢失 实现方案: 1,本地储存,进入页面获取本地数据,在进行数据操作 2,每操作一次数据就将数据传给后台进行保存,(操作数据多,用户量大对服务器造成压 ...