TCP简介
目录
首部格式
数据单位
特定
注意
自动重传请求ARQ
具体实现
发送缓存
接收缓存
滑动窗口
确认丢失和确认迟到
超时重传时间选择
报文段的发送时机
运输连接
发送TCP请求客户端
拥塞处理相关概念
避免拥塞具体实现
TCP的有限状态机
图释:
各个段位说明:
- 源端口和目的端口: 各占2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现.每个TCP段都包括源端和目的端的端口号,用于寻找发送端和接收端的应用进程。这两个值加上IP首部的源端IP地址和目的端IP地址唯一确定一个TCP连接。。
· 序号Seq: 占4 字节.TCP连接中传送的数据流中的每一个字节都编上一个序号.序号字段的值则指的是本报文段所发送的数据的第一个字节的序号.
· 序号用来标识从TCP发送端向接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
· 确认号ACK: 占4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号.
· ACK包含发送ACK的一端所期望收到的下一个序号。因此,确认序号应当时上次已成功收到数据字节序号加1。只有ACK标志为1时确认序号字段才有效。
· 数据偏移/首部长度: 占4 位,它指出TCP 报文段的数据起始处距离TCP报文段的起始处有多远.“数据偏移”的单位是32 位字(以4 字节为计算单位)
· 保留: 占6 位,保留为今后使用,但目前应置为0
· 紧急URG: 当URG=1 时,表明紧急指针字段有效.它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
· 确认ACK: 只有当ACK=1 时确认号字段才有效.当ACK=0 时,确认号无效
· PSH(PuSH): 接收TCP 收到PSH = 1的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付
· RST (ReSeT): 当RST=1 时,表明TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
· 同步SYN: 同步SYN = 1 表示这是一个连接请求或连接接受报文
· 终止FIN: 用来释放一个连接.FIN=1表明此报文段的发送端的数据已发送完毕,并要求释放运输连接
· 检验和CheckSum: 占2 字节.检验和字段检验的范围包括首部和数据这两部分.在计算检验和时,要在TCP 报文段的前面加上12字节的伪首部
· 紧急指针: 占16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
· 选项: 长度可变.TCP最初只规定了一种选项,即最大报文段长度MSS.MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS 个字节.” [MSS(Maximum Segment Size)是TCP 报文段中的数据字段的最大长度.数据字段加上TCP 首部才等于整个的TCP报文段]
· 填充: 这是为了使整个首部长度是4 字节的整数倍
· 其他选项:
· 窗口扩大: 占3 字节,其中有一个字节表示移位值S.新的窗口值等于TCP首部中的窗口位数增大到(16 + S),相当于把窗口值向左移动S 位后获得实际的窗口大小
· 时间戳timestamp: 占10字节,其中最主要的字段时间戳值字段(4字节)和时间戳回送回答字段(4字节)
· 选择确认: 接收方收到了和前面的字节流不连续的两2字节.如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据
TCP传送的数据单位协议是TCP报文段(segment)
(1)TCP/IP协议族:
web客户端与服务器之间使用TCP通信,TCP又使用IP通信,IP再通过某种形式的数据链路层通信。
应用层(应用程序)-->传输层(TCP/UDP)-->网络层(IP)-->数据链路层
(2)TCP是一个面向连接的协议,为用户提供可靠的全双工字节流。
TCP套接字是一种流套接字。
TCP关心确认,超时,重传。
(3)可靠性:
1.确认,重传:
tcp向另一端发送数据时,它要求对端返回一个确认,如果没收到确认,tcp就会自动重传数据并等待更长时间。
2.超时:
tcp含有动态估算客户与服务器之间的往返时间RTT(round-trip time )的算法,以确认需要等待多长时间。
3.有序:
tcp通过给其中的每个字节关联一个序列号对发送的数据进行排序。
TCP报文段作为IP数据报来传输,IP数据报的到达可能失序,所以TCP报文段的到达也可能失序。如果必要,TCP将对收到的数据重新排序,将收到的数据以正确的顺序交给应用层。
如:假设一个应用写2048个字节到一个TCP套接字,导致TCP发送2个分节/报文段:第一个分节/报文段所包含的数据序列号为1-1024,第二个分节/报文段序列号为1025-2048.(分节/报文段是TCP传输给IP的数据单元)如果这些分节非顺序到达,接收端TCP将根据它们的序列号重新排序,再把数据传递给接收应用。如果接收TCP接收到重复数据,它可以判断数据是重复的,从而丢弃重复数据。
4.流量控制(flow-control):TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通告窗口(advertised-window).该窗口指出接收缓冲区当前可用的空间量,从而确保发送的数据不会使接收端缓冲区溢出。
5.校验:
对首部和数据进行校验;
(4)TCP选项:
1.MSS:最大分节/报文段大小(maximum segment size)规定了TCP传往另一端的最大数据库的长度。
TCP对应用进程一次把多长的报文发送到TCP的缓存中是不关心的
TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP发送的报文长度是应用进程给出的)
TCP 可把太长的数据块划分短一些再传送.TCP也可等待积累有足够多的字节后再构成报文段发送出去
每一条TCP连接有两个端点
TCP 连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口.TCP连接的端点叫做套接字(socket)或插口
定义:
可靠传输协议常称为自动重传请求ARQ (Automatic Repeat reQuest)
累积确认:
· 定义: 接收方一般采用累积确认的方式.即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了
· 优点: 容易实现,即使确认丢失也不必重传
· 缺点: 不能向发送方反映出接收方已经正确收到的所有分组的信息
Go-back-N(回退N):
如果发送方发送了前5个分组,而中间的第3 个分组丢失了.这时接收方只能对前两个分组发出确认.发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次
说明:
· TCP连接的每一端都必须设有两个窗口一个发送窗口和一个接收窗口
· TCP可靠传输机制用字节的序号进行控制.TCP所有的确认都是基于序号而不是基于报文段
· TCP两端的四个窗口经常处于动态变化之中
· TCP连接的往返时间RTT 也不是固定不变的.需要使用特定的算法估算较为合理的重传时间
图释:
发送缓存用来暂时存放:
· 发送应用程序传送给发送方TCP 准备发送的数据
· TCP已发送出但尚未收到确认的数据
图释:
接收缓存用来暂时存放:
· 按序到达的、但尚未被接收应用程序读取的数据;
· 不按序到达的数据
图释:
图释:
特点:
· 以字节为单位的滑动窗口
· A的发送窗口并不总是和B的接收窗口一样大(因为有一定的时间滞后)
要求:
· TCP标准没有规定对不按序到达的数据应如何处理.通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程
· TCP要求接收方必须有累积确认的功能,这样可以减小传输开销
具体实现:
具体实现:
TCP每发送一个报文段,就对这个报文段设置一次计时器.只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段
加权平均往返时间:
做法:
TCP保留了RTT的一个加权平均往返时间RTTS(这又称为平滑的往返时间),第一次测量到RTT 样本时,RTTS值就取为所测量到的RTT样本值.以后每测量到一个新的RTT 样本,就按下式重新计算一次RTTS:
公式:
新的RTTS = ( 1 - α)×(旧的RTTS)+α(新的RTT 样本)
说明:
式中,0 ≤ α<1.若α很接近于零,表示RTT 值更新较慢若选择α接近于1,则表示RTT 值更新较快
RFC 2988 推荐的α值为1/8,即0.125
超时重传时间RTO:
RTO应略大于上面得出的加权平均往返时间RTTS.
RFC 2988 建议使用下式计算RTO:
RTO=RTTS +4×RTTD
RTTD是RTT的偏差的加权平均值
RFC 2988 建议这样计算RTTD.第一次测量时,RTTD值取为测量到的RTT样本值的一半.在以后的测量中,则使用下式计算加权平均的RTTD:
新的RTTD = (1-β)×(旧的RTTD)+β×|RTTS﹣新的RTT 样本|
β是个小于1 的系数,其推荐值是1/4,即0.25
在计算平均往返时间RTT时,只要报文段重传了,就不采用其往返时间样本
修正的Karn算法:
报文段每重传一次,就把RTO 增大一些:
新的RTO= γ×(旧的RTO)
系数γ的典型值是2
当不再发生报文段的重传时,才根据报文段的往返时延更新平均往返时延RTT 和超时重传时间RTO的数值
持续计时器
· TCP为每一个连接设有一个持续计时器
· 只要TCP 连接的一方收到对方的零窗口通知,就启动持续计时器
· 若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值
· 若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器
· 若窗口不是零,则死锁的僵局就可以打破了
TCP维持一个变量,它等于最大报文段长度MSS.只要缓存中存放的数据达到MSS字节时,就组装成一个TCP 报文段发送出去
由发送方的应用进程指明要求发送报文段,即TCP 支持的推送(push)操作
发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过MSS)发送出去
(转) TCP简介
浙公网安备 33010602011771号