TCP/IP 协议栈
传输层的功能:
为应用程序(进程)提供了逻辑通信
- 传输层协议UDP和TCP
- 网络安全
- TCP可靠传输的实现
- TCP的流量控制
- TCP的拥塞控制
- TCP的运输连接管理
TCP与UDP
TCP(Transmission Control Protocol,传输控制协议)
UDP(User Data Protocol,用户数据报协议)
UDP的主要特点
UDP是无连接的,即发送数据之前不需要建立连接
UDP尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制
UDP是面向报文的,UDP没有拥塞控制,适合多媒体通信的要求。
支持一对一、一对多、多对一、多对多的交互通信。
UDP 的首部开销小,只有8个字节。
首部格式:
TCP
- TCP是面向连接的传输层协议
- 每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点的
- TCP提供可靠交付的服务
- TCP提供全双工通信
面向字节流
面向字节流的传输
TCP把连接作为最基本的抽象
每一条TCP连接有两个端点
TCP连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。TCP连接的端点叫做套接字(socket)
端口号拼接到IP地址即成了套接字
套接字socket = IP : PORT
每条TCP连接唯一地被通信两端的两个端点(即2个套接字)所确定
tcp ::={socket 1,socket2} ={(ip1:port1),(ip2:port2)}
TCP如何实现可靠传输
停止等待协议
确认丢失和确认迟到
使用上述的确认和重传机制,我们就可以在不可靠传输的网络上实现可靠的通信。
这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat reQuest)
ARQ表明重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。
连续的ARQ协议
通过逐个确认发送窗口中数据包的确认收到来确保可靠传输的实现
累计确认
接收方收到了1、2、3个数据包,则确认收到3数据包,1、2不需要发送确认
接收方收到了1、2、4个数据包,但是没有收到第三个,就会确认收到了1、2 请求重发3 (这里没讲4怎么办 —- 4的解决方案 SACK 选择确认 服务端发送一个值)
TCP报文格式
TCP的首部没有固定长度,因为长度是可变的。但是存在20个字节的固定首部。
序号seq
序号是一个值,表示当前数据段中第一个字节在整个数据包中的序号。
确认号ACK
接受方收到发送方发送过来的数据段之后,发送一个确认号给发送端,值为上一个数据段中最后一个字节+1
下图的确认号为5
数据偏移
用来记录TCP报文段与数据部分的区分值
数据偏移只占4个字节,所以值最大为15 肯定不够用来描述整个值 所以数据偏移中的4个二进制位 一个1代表4个字节
所以我们可以得出选项部分 最长为40个字节
保留
暂时还没有用
流量上看上述几个值
TCP建立会话:
MSS 请求方支持的最大数据包1460
第二个数据包中 服务端确认的MSS,且告知发送端自己的缓存窗口Win为 64240
第三个数据包中 请求端告知服务器自己的缓存窗口为65535
URG
URG是紧急标志位。当URG=1时,表示紧急指针有效,即此报文时紧急报文优先发送,不再按序发送。此时与后面的紧急指针配合,向后偏移至此报文处,发送此报文。
可以随意加塞
ACK
PSH
PSH是紧急标志位。当PSH=1时,表示紧急指针有效,即此报文时紧急报文优先接受,不再按序接受。
可以随意加塞
RST
RST表示会话出现严重错误,需要重新建立连接。
RST为1 就会拒绝后面的数据通信
SYN
在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文
握手的时候,可以看到前两次交互,都有SYN标志。
FIN
数据传输完毕之后,释放连接 FIN = 1
窗口
校验和
首先,把伪首部、TCP报头、TCP数据分为16位的字,如果总长度为奇数个字节,则在最后增添一个位都为0的字节。
把TCP报头中的校验和字段置为0(否则就陷入鸡生蛋还是蛋生鸡的问题)。
其次,用反码相加法累加所有的16位字(进位也要累加)。
最后,对计算结果取反,作为TCP的校验和。
紧急指针
在URG位1的情况下,紧急指针才起作用
如果URG为1 且紧急指针为100 则表示 1-100 为需要紧急处理的数据
选项
Maximum seqment size 可以规定最大数据报是多少 MSS
NOP 没设置
NOP 没设置
SACK permitted 选择性确认
TCP如何实现可靠传输
以字节为单位的滑动窗口技术
发送发送窗口中的数据包
接收方收到数据之后返回ACK 窗口后移
TCP如何实现流量控制
cwnd的值是关键
TCP的拥塞控制主要原理依赖于一个拥塞窗口(cwnd)来控制,在之前我们还讨论过TCP还有一个对端通告的接收窗口(rwnd)用于流量控制。窗口值的大小就代表能够发送出去的但还没有收到ACK的最大数据报文段,显然窗口越大那么数据发送的速度也就越快,但是也有越可能使得网络出现拥塞,如果窗口值为1,那么就简化为一个停等协议,每发送一个数据,都要等到对方的确认才能发送第二个数据包,显然数据传输效率低下。TCP的拥塞控制算法就是要在这两者之间权衡,选取最好的cwnd值,从而使得网络吞吐量最大化且不产生拥塞。
TCP拥塞控制
拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,已经与降低网络传输性能有关的所有因素
流量控制往往指在给定的发送端和接受端之间的点对点通信量的控制,它所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
慢开始与拥塞避免
发送方维持拥塞窗口CWND(congestion window)
发送方控制拥塞窗口的原则是:
只要网络没出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。
只要网络出现了拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
慢开始
快重传
https://blog.csdn.net/whgtheone/article/details/80983882
- 当一个报文段丢失时,会等待一定的超时周期然后才重传分组,增加了端到端的时延。
- 当一个报文段丢失时,在其等待超时的过程中,可能会出现这种情况:其后的报文段已经被接收端接收但却迟迟得不到确认,发送端会认为也丢失了,从而引起不必要的重传,既浪费资源也浪费时间。
幸运的是,由于TCP采用的是累计确认机制,即当接收端收到比期望序号大的报文段时,便会重复发送最近一次确认的报文段的确认信号,我们称之为冗余ACK(duplicate ACK)。
如图所示,报文段1成功接收并被确认ACK 2,接收端的期待序号为2,当报文段2丢失,报文段3失序到来,与接收端的期望不匹配,接收端重复发送冗余ACK 2。
快恢复
https://blog.csdn.net/q1007729991/article/details/70185266
一旦出现超时重传,TCP 就会把慢启动门限 ssthresh 的值设置为 cwnd 值的一半,同时 cwnd 设置成 1. 但是快恢复算法不这样做。
一旦出现超时重传,或者收到第三个重复的 ack 时(快重传),TCP 会把慢启动门限 ssthresh 的值设置为 cwnd 值的一半,同时 cwnd = ssthresh (在有些版本中,会让 cwnd = ssthresh + 3)。
之前的旧版本的算法是在 TCP 的 Tahoe 版本中,而改进的版本算法是在 TCP Reno 版本中。图 2 中演示了他们之间的区别。蓝色曲线是旧版本,而红色是新版本。