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协议的,应用程序和数据库交互也是 ...
随机推荐
- LR Optimization-Based Estimator Design for Vision-Aided Inertial Navigation
Abstract 我们设计了一个 hybrid 估计器, 组合了两种算法, sliding-window EKF 和 EKF-SLAM. 我们的结果表示, hybrid算法比单一的好. 1. Intr ...
- mysql 操作数据库
创建数据库 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name(数据库名字) #添加 IF NOT EXISTS,如果已有数据库,将会提醒,不会出现错 ...
- python接口测试之日志功能
之前在简书中看了一篇关于日志功能的文档,供大家参考:https://www.jianshu.com/p/62f7b49b41e7 Python通过logging模块提供日志功能,所以直接导入即可 im ...
- go init执行顺序
package test import "fmt" // 初始化函数 引入包的时候要先执行 可以重复定义多个 同一个go文件从上到下 多个文件 是按照字符串进行排序 从小到大 执行 ...
- centos平台scp通过密钥远程复制文件(免密登录)
一,说明:两台机器的平台和ip 1,a服务器: centos8:ip:121.122.123.47 版本 [root@yjweb ~]# cat /etc/redhat-release CentOS ...
- buuctf-pwn:jarvisoj_level6_x64
jarvisoj_level6_x64 只能申请unsorted bin大小下的unlink IDA看一下,可以发现edit里面有任意堆溢出的情况(realloc造成堆溢出) 然后free里面有UAF ...
- python的各种库的用法
scipy.io 用于输入和输出数据的操作,可操作matlab的.mat文件. (1)加载.mat文件的数据 import scipy.io as sci data_dir = sci.loadmat ...
- 转 js调用提交表单。
今天做网银支付的时候,需要做到点击支付的时候提交订单,然后新窗口打开支付界面. 思路1:window.open(''),这个直接被pass了,因为银行的服务一般都是需要post数据的.就算是可以用ge ...
- 从APT攻击中学习
0x01. 什么是APT? 可以看出APT攻击,叫高级可持续威胁攻击,也称为定向威胁攻击:什么是定向,也就是指定目标行业而发起进攻 这边又提到供应链和社会工程学,那是什么? 社会工程学,也就是社工,通 ...
- iOS 14 egret 游戏卡顿问题分析和部分解决办法
现象 总体而言,iOS 14 渲染性能变差,可以从以下三个测试看出. 测试1:简单demo,使用egret引擎显示3000个图(都是同一个100*100 png 纹理),逐帧做旋转.(博客园视频播放可 ...