C++小白成长记(面试基础之计算机网络,更新中)
UDP与TCP
UDP与TCP均为传输层最为重要的协议
主要区别如下:
UDP是非可靠连接,面向报文(整个报文发送),支持多对多发送,报文首部比较小(只有校验);
TCP是可靠连接,面向字节流(因为有拥塞控制,丢包重传等机制),只支持一对一,报文首部比较大(提供校验,ACK,序号,确认号等等);
TCP如何建立连接(三次握手):
- 客户端向服务器端发送连接请求,SYN=1,seq=x;
- 服务器端收到连接请求后确认并回复连接请求,SYN=1,ACK=1,seq=y,ack=x+1;
- 客户端收到服务器端的确认后再次确认,ACK=1,seq=x+1, ack=y+1;
TCP如何提供可靠连接:
- 校验,与UDP一样,通过伪首部(累计和与取反码)来确认收到的报文是否正确;
- 序号,给字节编序号,以方便后面的确认和重传;
- 确认,接收端在接收到字节流或者固定时间内没有收到数据的话,就向发送端发送需要接收的最小序号的字节(发送端可以从缓存中删除已成功发送的字节);
- 重传,发送端收到接收端发送的接收请求,或者过长时间没有收到确认,便重新发送未确认的字节流。超时间隔是动态确认的,根据之前收到确认报文的速度进行加权,动态处理;
附加:客户端持续发送连接请求但是不回应,导致服务器崩溃,解决方法SYN cookie
TCP如何实现流量控制
通过接收方确认时(确认连接或者确认接收)发送的接收窗口大小来进行流量控制
TCP如何实现拥塞控制
- 慢开始,从一个报文段长度开始,并指数增长,收到一次确认增长一次
- 拥塞避免,到达一定阈值(提前设置好的阈值)后,就开始一个个报文段缓慢增加来替换指数增长,之后如果发送方检测到网络拥塞(必定堵塞,所谦让一些),直接将发送速率降低到初始值1,再进行慢开始;
- 快重传,如果连续三次收到对方对同一个报文段的接收请求,说明报文段丢失,不用等待固定时间,直接进行重传;
- 快恢复,如果发生了快重传,那可能是网络堵塞也有可能是丢包,所以不用太过激进,进行快恢复即可,不是直接减少到初始情况,而是将发送速率减半处理;
TCP如何断开连接(四次挥手)
- 客户端发送断开连接的请求,FIN=1,seq=x;
- 服务器端接收到客户端断开连接的请求并确认,ACK=1,ack=x+1,seq=y;
- 服务器结束发送的数据后也向客户端发送断开连接的请求,FIN=1,ACK=1,ack=x+1,seq=y;
- 客户端接收到服务器端的请求并确认,ACK=1,ack=y+1,seq=x+1;客户端在 2*最长报文段寿命(因为有可能最后一个确认消息失败了) 后关闭客户端,如果再次收到服务器的关闭请求,则再进行第四步;