20220311
一 . 运输层
复用/分用
发送方运输层的udp协议会复用应用层的报文段,添加udp首部,只以源端口及目的端口标识该报文段
接收方运输层的udp协议会分用网络层的ip数据报,根据首部中的目的端口将数据报交给应用层指定进程。
发送方运输层的tcp协议会复用应用层的报文段,添加tcp首部,以源端口、目的端口、源ip地址、目的ip地址标记该报文段
接收方运输层的tcp协议会分用网络层的ip数据报,根据首部中的四个值,交给指定应用进程建立的一个套接字(接收方一个应用进程可以和不同发送方都建立一个套接字)
二。TCP对比UDP
- udp不需要建立连接即可发送数据,tcp要三次握手建立连接,发送数据后还需要四次挥手释放连接
- udp支持单、多、广播,tcp因为建立专用连接,只支持单播
- UDP面向报文段,直接发送应用层交付的整个报文段。TCP面向字节流,缓存应用层交付的数据报,从中提取字节流分段发送。
- UDP不提供可靠传输,TCP提供可靠传输(流量控制及拥塞控制)
三。 TCP流量控制
流量控制是在滑动窗口的基础上实现的,接收方通过告知发送方调整发送窗口来实现。
如果接收方让发送方调整发送窗口为0,发送方会启动一个0窗口计时器。如果超时未收到增大窗口通知,则发送0窗口确认报文,并为该报文启动一个0窗口确认报文计时器,该确认计时器如果超时,则继续重传0窗口确认报文,直到收到接收方的增大窗口通知为止。
四 . TCP拥塞控制
拥塞控制四大算法:慢开始、拥塞避免、快重传、快恢复
发送方会维护一个拥塞窗口,而接收方还会告知自己的接收窗口,发送方的发送窗口取接收窗口和拥塞窗口中更小的一个。
发送方开始发送数据时,使用慢开始算法,初始只能发送一个报文段,下次可发送2个,再下次可发送4个,发送窗口大小以2的指数级增长。当发送窗口大于拥塞窗口时,使用拥塞避免算法,下次发送只能多发送一个。
使用拥塞避免算法时,如果出现了超时,当前拥塞窗口减半,发送窗口设置为1,重新使用慢开始算法。
但如果在超时计时器生效之前,连续收到三个重复确认,则拥塞窗口减半,然后发送窗口设置为拥塞窗口值,继续执行拥塞控制算法。
五。tcp建立连接
简述:三报文握手->传输数据->四报文挥手
三报文握手
客户端想要和服务器建立连接,经历以下过程:
大写为本次数据包的类型,小写为实际值
- 客户端发送数据包,SYN=1,seq=0,请求服务端建立连接
- 服务端接收数据包,SYN=1,ACK=1,seq=1,ack=1,同意建立连接,请客户端从1号位开始发送数据(ack=0+1)
- 客户端发送数据包,ACK=1,seq=1,ack=1,收到同意请求,请服务端也从1号位开始发送数据
数据传输 - 客户端发送确认包后,发送第一个数据包,seq=1,ack=1,len=725,客户端本次发送725字节数据
- 服务端确认客户端的确认包,seq=1,ack=726(已收到725字节数据,请从726开始发送)
- 客户端发送确认包,seq=726,ack=1…
无论是客户端还是服务端向对方传输数据,ack就为已收到的字节数+1(接收窗口),seq为对方上个确认包的ack值(发送窗口),这样就串联起来了
四次挥手
假设客户端想要主动关闭连接 - 客户端发送数据包,FIN=1,seq=1000,请求关闭连接。客户端进入FIN_1状态
- 服务端接收到该包,知道客户端想关闭连接,但不会马上关闭连接。服务端发送数据包,seq=600,ACK=1001,继续传输一些数据。客户端收到该包,了解服务端同意关闭连接,进入FIN_2状态
- 服务端数据传输完了,发送数据包,FIN=1,seq=600。服务端数据已传输完毕,服务端需要断开连接,客户端可以准备关闭连接。服务端进入关闭最后确认状态。
10.客户端收到数据包,发送ACK=601,seq=1001。客户端进入关闭等待状态。服务端收到该确认包,关闭连接。客户端在关闭等待状态下等待两倍的数据包最大存活时长后,最终关闭
总结:
- 主动发起方反而是最后关闭的
- 之所以要等待2MSL(一来一回)。第一是要保证服务端能够正确关闭连接,如果第四次的ACK丢失,2MSL的时候可能服务器重传的FIN刚好到达,此时可以发出最后一个ACK,然后又进入2MSL等待。如果这个ACK,服务端真的没收到,那么也可以确保网络中不会有这一次连接的数据包了,下一次连接可以正常建立(可以使用同ip和端口)。
tcp首部常用标志位:
- PSH置1,数据推送,接收方需尽快交付给上层应用
- RST置1,本次请求有误,请释放并重新建立
- SYN置1,三次握手使用
- FIN置1,四次挥手使用