TCP
概述
- 面向连接
- 点对点
- 可靠交付
- 全双工
- 面向字节流
面向连接
TCP把连接作为基本的抽象,TCP的连接的点对点这个点事IP和端口号组合,是套接字(如摸个程序在某个网卡(IP地址)下监听某个端口,下面就是监听在所有网卡)。
可靠传输
TCP基于IP(最大努力服务),因此TCP必须采取适当措施才能使连接可靠。
理想的传输条件有以下两个特点:
- 传输信道不产生差错。(信道)
- 不管发送方以多快速度发送数据,接收方总是来得及处理收到的数据。(端点)
然而都不具备。所以:
- TCP接收端要能发现差错,并能为发送方所知。
- 当接收方不能处理发过来的数据,应当主动告知发送方。
先从最简单的发一个确认一个谈起:
出现差错
当出现差错的时候,接收方没收到没法传确认,发送方没收到接收方的确认。双方怎么感知呢?时间!超时重传。
分组超时计时器
注意:
- 发送完分组后要保留副本,只有在收到响应确认后才能清除保留的副本。
- 分组和确认要进行编号。
- 超时计时器设置的重传时间要比发送和收到确认平均往返时间个更长一些。
确认丢失和确认迟到
确认丢失
- 确认丢失发送方重传,接收方收到重传的数据后丢弃,并不向上层交付。
- 接收方还要发送确认,因为既然发送方重传说明没有收到确认。
这些逻辑都需要分组编号才能实现,不管是数据分组和确认分组,sequence number,acknowledge number.
确认迟到
发送方重传之后收到迟来的确认就是丢弃了,但也知道接收方接收到了。
ARQ
上述重传自动进行叫ARQ(automatic repeat request)。也就是发送方重传是自动进行的。
能够在不可靠的网络上实现可靠传输。
信道利用率
当在不可靠网络上实现了可靠传输模型,既可以在其基础上优化了。
发送一个分组,等待一个确认,信道利用率太低。
RTT round-trip time
RTT=传播时延+排队时延(路由器和交换机的)+数据处理时延(应用程序的)。
这样采用流水线传输提高信道利用率
连续ARQ
想要连续发送必然在数据包编号的时候要为其进行连续编号,序号。
既然连续发送,就能累计确认。
TCPHeader
需要注意
-
标志位ACK
仅当ACK置位时有效,TCP规定连接建立后所有传送的报文段都必须把ACK置1
-
复位RST
当RST=1时表明TCP连接中出现严重错误,必须释放连接,并且也被用来拒绝一个非法的报文段或拒绝打开一个连接,nmap的syn扫描就是根据此原理。
-
窗口 windows size
窗口指明发送方接受缓存大小(以字节为单位),可以进行流控。
-
选项
-
MSS
TCP数据段大小
主要考虑MTU,以太网为1500,其中IP占20字节,TCP最小20字节,所以MSS最大1460字节
-
时间戳选项
可以用来计算RTT
也为应对大带宽下TCP序号绕回问题。
超时重传
RTT round trip-time
RTT 记录的报文段发出时间,以及收到相应确认时间,时间之差为RTT,对其进行加权平均RTTs,称为加权平均往返时间。旧的和新的RTT都有一个权重,RFC建议0.125.
新的RTTs=(1-α) * 旧的RTTs+α * 新的RTT
超时重传时间RTO
流量控制
folow control
通过窗口大小可以进行端到端的流量控制,windows size 为0时停止传输。
发送端会进行零窗口探测。每个连接只要收到零窗口报文会生成一个持续计时器persistense timer
拥塞控制
拥塞控制是一个全局性过程,防范中间设备路由器等丢弃包引来更多的重传,情况持续恶化。
流量控制是端到端过程,控制的是端。
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
基于窗口
发送方维持一个拥塞窗口状态变量。
发送窗口等于拥塞窗口,基于超时调节。
TCP连接管理
连接建立
三报文握手
-
最后一个报文的意义在于防止“已失效的连接请求报文段”,即客户端的请求连接滞后到达,服务端重新又开一个连接。