TCP与UDP
区别:
- udp是不面向连接的,tcp是面向连接的,并且它能保证数据的有序和有效,但是udp不行,它不能保证,它可能会存在错误;
- tcp还具有超时重传的功能;tcp能保证数据达到一定限制后就不再接收,但是udp不会,就容易造成堵塞;
- 当然udp也有自己的优点,udp可以进行广播,但是tcp不行
介绍:
传输控制协议TCP,提供面向连接、可靠的数据传输服务,数据单位:报文段,有流量控制、拥塞控制、提供全双工通信、面向字节流(将应用层传下来的报文看成字节流,把字节流组织成大少不等的数据块),每一条TCP连接只能是点对点的,提供完整性服务
用户数据报协议UDP,提供无连接,尽最大努力的数据传输服务,数据单位:用户数据报,没有拥塞控制,面向报文(对应用层传下来的数据既不合并也不拆分,只加UDP首部),支持一对一,一对多、多对多和多对一的交互通信,主要提供及时性服务
UDP数据报格式
UDP用户数据报的首部的十六进制表示是:
06 32 00 45 00 1C E2 17
- 06 32是源口 十六进制转十进制6*16^2+3*16^1+2*16^0=1586.
- 00 45是目的端口 转十进制4*16^1+5*16^0=69
- 00 1c是用户数据包的总长度=16+12=28
- 数据部分长度为:28-首部长度=28-8=20
- 由于目的端口69<1023是熟知端口(服务器端使用的端口号),因此该UDP数据报是从客户发给服务器的,程序是TFTP
两种方法
- 十六进制->二进制->十进制
- 十六进制->十进制
TCP报文例题
注意点70到99是30字节的数据,A向B发两个报文段,B收到第一个报文段后发送的确认号应为第二个报文段的序号
22.主机 A 向主机 B 连续发送了两个 TCP 报文段,其序号分别为 70 和 100。试问:
(1)第一个报文段携带了多少个字节的数据?
(2)主机 B 收到第一个报文段后发回的确认中的确认号应当是多少?
(3)如果主机 B 收到第二个报文段后发回的确认中的确认号是 180,试问 A 发送的第二个报文段中的数据有多少字节?
(4)如果 A 发送的第一个报文段丢失了,但第二个报文段到达了 B。B 在第二个报文段到达后向 A 发送确认。试问这个确认号应为多少?
- 100-70=30,(99-70+1)
- 100,下一个的序号
- 180-100=80,(179-100+1)
- 70
tcp滑动窗口,拥塞控制,确认号
滑动窗口
- 滑动窗口协议,用于流量控制,可以加速数据的传输,可以发送多个数据包,而不需等待ACK
- 包含发送窗口和接收窗口
- 客户端和服务端各一个滑动窗口
- 窗口大小由接收窗口决定
- 在收到ACK后,当前窗口可以被移除,指针后移即可
发送窗口
是操作系统的一个缓冲区,是一个循环数组被三个指针分割区域为四个区域
四个区域
- 发送并确认接收--此区域可以被新数据覆盖
- 发送未确认接收
- 可以发送未发送
- 不能发送
三个指针
- 指针1: 指向第一个已发送但是未接收到ack的字节
指针2: 指向第一个允许发送但是还未发送的字节
指针3: 发送窗口的大小
接收窗口
当数据包的seq == RCV_NEXT的数据包的时候,指针RCV_NEXT会向后移到窗口内第一个未接收数据的字节,指针WND会减去移动的字节数
当数据包的seq < RCV_NEXT时,表示该数据包已被接收,接收方会重新发送ACK
三个区域
- 应用层已经读取的数据
- 接收并发送确认请求
- 接收窗口的数据
- 接收窗口无序接收数据包,导致部分数据接收成功,部分未接收,直接缓存到接收窗口(仍然会发送ACK)
- 还未收到的数据
- 超出窗口范围
两个指针
- 指针1-RCV_NEXT指向窗口内第一个未接收数据的字节
- 指针2-WND规定窗口大小
特殊情况,当A向B发送数据,B的缓冲区满了,此时A停止发送,之后B的缓冲区恢复,B发送的报文丢失,A并未收到,会导致双方出现互相等待的状态,出现死锁。引入持续计时器,当A收到零窗口请求时,开启次计时器,每到计时器结束,发送一个1字节探测报文,会返回窗口大小,如果仍为0,则再次开启。
拥塞控制
TCP tahoe 与TCP reno
TCP Tahoe协议是TCP最早的TCP拥塞控制版本,主要包括三个机制用于控制拥塞窗口:慢启动、拥塞避免和快速重传。
Reno是应用最广泛且较为成熟的算法。该算法所包含的慢启动、拥塞避免和快速重传、快速恢复机制,是现有的众多算法的基础。
拥塞的条件
- 重传计时器超时---进入慢开始
- 收到三个重复的ACK---进入快重传,快恢复
慢开始
增长速度为指数级别,每轮增长为2*,即1-2-4-8-16
避免因流量过大导致网络阻塞,引入了ssthresh变量,设置慢开始的结束点,然后把cwnd设置为1,开始慢开始算法
拥塞控制
增长速度为线性增长,每轮拥塞窗口+1,可以有效防止网络过早拥塞
加法增大(超时情况)与乘法减小(防止网络过早拥塞)
加法增大:只要出现超时,就把ssthresh减半
乘法减小:每次拥塞控制为线性增长,防止网络过早拥塞
快重传
规定当发送方收到三个连续重复的确认请求时,直接重传,而不用等重传计时器到时,可以加大网络吞吐量
例如:发送方传送M1,M2,M3给接收方,接收方连续发送了三个对M2的确认请求,则发送方直接重传M3
快恢复
当收到三个连续重发的确认请求,在快重传后,设置cwnd=ssthresh,直接进入拥塞控制阶段,