TCP协议原理与格式初探

Wesley13
• 阅读 460

[TOC]

可靠数据传输原理

如何在一条不可靠的信道上得到可靠的传输? 不可靠的原因:可能出现比特差错、丢包

停等传输下的情况

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

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拥塞控制

TCP协议原理与格式初探

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

TCP吞吐量

一条连接的平均吞吐量=0.75W/RTT,W为丢包发生时的窗口长度 经高带宽路径的平均吞吐量=1.22MSS/(RTT*根号L),L为丢包率

AIMD算法公平吗

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
34.TCP取样器
阅读文本大概需要3分钟。1、TCP取样器的作用   TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据。2、TCP取样器详解!(https://oscimg.oschina.net/oscnet/32a9b19ba1db00f321d22a0f33bcfb68a0d.png)TCPClien
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这