1、TCP协议的特点和报文格式
1.1 特点
TCP是面向链接(虚连接不是真实的物理线路)的传输层协议。每一条TCP链接都是点对点的全双工通信。TCP提供可靠交 付的服务,可靠有序、不丢不重。
发送缓存:已发送但未接收到确认的报文&待发送的报文
接收缓存:按序到达但未被上层读取的数据&未按序到达的数据
TCP将上层的数据看作是连续的一串字节数据流。
TCP协议将多个字节包装为一个数据包,并添加TCP首部发送出去。
1.2 报文格式
TCP报文包括数据部分和首部字段两部分。数据部分就是上层数据的多个字节。
首部字段格式如下:
网路层通过IP找到主机,那怎么找到是这台主机的哪个进程需要这个TCP数据包呢,就是通过端口来区分。因此首部包含了源端口和目的端口。TCP为每一个数据字节都编了号,首部序号是当前报文中第一个字节的序号。确认号x表示当前需要对方发送的下一个数据包的序号是x,也表示x之前的数据包都收到了。窗口字段表示流量控制使用的字段,表示要求对方将窗口调整为该字段大小,控制发送方发送速率,实现流量控制,窗口=min{接收窗口,拥塞窗口}。校验和是对报文数据部分的正确性校验,从而提供一个保证可靠的手段。
ACK位是指首部中的确认号是否有效;SYN位是标识当前是请求链接建立或者应答请求建立链接的数据报文;FIN是标识当前是请求拆除链接的报文。
2、TCP链接管理
链接管理主要是建立链接和拆除链接的机制。
三次握手(建立链接)
1)客户端请求建立链接:SYN=1,ACK=0,seq=x,ack=无效;此时无需确认因此ACK等于0,ack无效,请求链接SYN=1,seq是发送方随机的序号初始码
2)服务器发送应答:SYN=1,ACK=1,seq=y,ack=x+1;此时需要确认,因此ACK=1,ack=已接受序号+1
3)第三次握手:SYN=0,ACK=1,seq=x+1,ack=y+1;
为什么是三次握手,不是两次或者四次?首先四次没必要,三次已经满足要求,继续增加徒增时延。不是两次是因为,如果没有第三次握手,服务端发出确认就开始监听客户端数据,对服务端可能造成资源浪费,因为连接建立请求可能是在网络中滞留很久的数据包,已经无效了,再为其监听等待客户端数据无意义。
四次挥手(拆除链接)
1)TCP链接全双工通信,一方请求拆除链接只是拆除单方向的链接,另一方向的链路还可以继续发送数据。
2)为什么要有等待2MSL的过程?因为服务端发送了FIN后,客户端为其发送应答,如果此应答丢包了,那么服务端一直处于半关闭状态,等待2MSL,期间服务端可能重发FIN,那么客户端可以接收到并发送响应。MSL是单向数据包传输最大时间,因此2MSL刚好是发送出去应答(最大MSL),对方没收到再此发送FIN(最大MSL)的时间和。这里有个疑问,如果2MSL期间,服务器端重发的FIN丢失了,直到2MSL结束客户端都没有再收到,但是服务端也没有收到响应一直重发FIN?此时客户端会直接关闭吗,那么这样服务器端岂不是存在半关闭状态的链接?
3、可靠传输
保证可靠传输的机制是:校验、序号、确认、重传(包括快重传)
校验就如上首部字段介绍的。序号是为上层数据的每个字节标一个序号,数据包的序号是包范围字节的首字节序号。确认是首部字段ACK和ack,ack的值x表示x之前的都收到了,就算是乱序收到了后面的,也会应答第一个没收到的序号。发送方在超过收到确认的时间后会重传,而如果连续收到三个冗余的确认,则不等时间到立即快速重传。
4、流量控制
流量控制与拥塞控制都是控制发送方的发送速率,但是其目的是不同的。流量控制关注的局部,是点对点的双方通信过程中,接收方接收速率跟不上发送方的发送速率,因此需要通过控制发送方速度。拥塞控制关注的是全局,是整个网络已经达到瓶颈,必须减少各个发送方的发送速度,从而避免网络阻塞。
流量控制的手段就是通过在接收方发送应答的中携带接收窗口值,来实现对发送方窗口的控制。
当然发送方窗口还受到拥塞窗口的影响,发送窗口=min{接收窗口,拥塞窗口}
5、拥塞控制
拥塞控制是避免整个网络拥塞,需要控制发送到网络的所有发送方的速度。拥塞控制不像流量控制那样是点对点的,因此无法实现一方直接发送窗口大小约束来实现控制,只能通过控制算法由发送方主动实现窗口大小的调整。分别是慢开始、拥塞避免算法和快重传、快恢复算法。
1)慢开始、拥塞避免
一开始拥塞窗口大小是1,然后呈指数增长,每次*2,直到到达拥塞避免阈值(初始16),开始以拥塞避免的加法增加(每次加1),直到出现网路拥塞,然后掉回慢开始初始窗口1,并调整拥塞避免阈值为出现网络拥塞是窗口大小的一半。重复慢开始过程。。。。。。
2)快重传、快恢复
不同于慢开始拥塞避免,快重传、快恢复算法中一旦遇到网络拥塞,不是掉回1,而是调回新的拥塞避免阈值,新的阈值为拥塞出现时窗口的一半大小。然后继续加法增大。这个过程避免了掉回1再经过慢开始的过程,使得发送方遇到网络阻塞时快速恢复发送速度,而不是从1开始慢慢恢复。适合突发网路阻塞,整体网络状态比较好的情况。