TCP
TCP和UDP的区别
- TCP是面向连接的,提供可靠交付,有拥塞控制,流量控制,提供全双工通信,面向字节流(把引用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每条TCP连接只能是点对点(一对一)。
- UDP是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只添加UDP首部),支持一对一,一对多,多对多的交互通信。
TCP三次握手
过程
- 主机A发送请求建立连接的请求 此时:SYN = 1 seq = x ACK = 0;
- 主机B接收之后如果要建立连接,发送一个确认连接的确认 此时:ACK = 1 seq = y ack = x + 1;
- 主机A对这个建立连接的确认的确认 ACK = 1 seq = x + 1 ack = y + 1;
其中 ACK表示确认
seq是一个随机序列
ack是对seq的确认所以是seq+1
为什么是三次握手而不是两次
因为如果客户端发送的请求连接的请求超时了,但是过了一段时间之后服务器又收到了这个请求。那么如果是两次握手建立连接,这个时候服务器就会建立连接,并返回一个确认,然后服务器的资源就会造成浪费,但是如果是三次握手,在第二次确认客户端收到之后,由于不需要连接,则不会返回一个确认,一段时间之后服务器会关闭连接。
TCP四次挥手
过程
- 主机A发送FIN = 1终止请求 seq = u随机初始序列号u
- 主机B发送ACK = 1确认终止 ack = u + 1下个数据包的编号 seq = v随机初始序列号v
- 主机B发送FIN = 1终止请求 ack = u + 1下个数据包编号 seq = w初始随机序列号
- 主机A收到确认发送ACK = 1确认 seq = u + 1 ack = w + 1下个数据包编号是终止序号那个w
- 主机A等待2MSL之后关闭连接
设置TIME-WAIT时间必须等待2MSL时间
- 保证A发送的最后一个ACK报文段能到达B,由于这个ACK可能丢失然后B会接收不到最终FIN+ACK确认报文,B会超时重传一次FIN+ACK报文而A收到之后会再次重传一次并启动2MSL计时器
- 可以使本连接持续时间产生的所有报文段从网络中消失,确保下一个新连接中不会出现旧的连接请求报文段
为什么是四次
因为TCP是全工双向连接,每次的FIN只能关闭一个方向的连接
TCP保证可靠传输
- TCP通过使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,就重传这个报文段。
- RTT一个报文从从发送再到接受到确认所经历的时间称为往返RTT
- TCP滑动窗口
拥塞控制
TCP主要通过四个算法来进行拥塞控制:满开始、拥塞避免、快重传、快恢复。
慢开始和拥塞避免
发送最开始执行慢开始,令cwnd = 1,发送方只发送一个报文段,当收到确认之后,讲cwnd加倍,因此之后发送方能发送的报文数段数量为:2、4、8
慢开始每轮将cwnd加倍,会让cwnd增涨速度飞快,从而网络拥塞的可能性也很高。设置一个满开始门限ssthresh,当cwnd>=ssthresh时进入拥塞避免,每轮次只讲cwnd+1
如果出现了超时,则令ssthresh = cwnd/2,再重新执行慢开始
快重传和快恢复
在接收方,要求每次接受到报文段都应该对最后一个已收到的有序报文段进行确认。例如已收到M1到M2,此时收到M4,应该发送对M2的确认。
在发送方,如果收到三个重复确认,那么可以知道下个报文段丢失,此时执行快重传,立即重传下一个报文段,例如收到三个M2则M3丢失,立即重传M3。
- 由于只是报文段丢失,不是网络拥塞,从而执行快恢复,令ssthresh = cwnd/2,cwnd = ssthresh,注意到此时直接进入拥塞避免
慢开始和快恢复的快慢指的是cwnd的设定值,而不是cwnd的增长速度,cwnd设定值为1,快开始cwnd设定为ssthresh。