C++小白成长记(面试基础之计算机网络,更新中)

UDP与TCP

UDP与TCP均为传输层最为重要的协议

主要区别如下:

UDP是非可靠连接,面向报文(整个报文发送),支持多对多发送,报文首部比较小(只有校验);
TCP是可靠连接,面向字节流(因为有拥塞控制,丢包重传等机制),只支持一对一,报文首部比较大(提供校验,ACK,序号,确认号等等);

C++小白成长记(面试基础之计算机网络,更新中)

TCP如何建立连接(三次握手):

  1. 客户端向服务器端发送连接请求,SYN=1,seq=x;
  2. 服务器端收到连接请求后确认并回复连接请求,SYN=1,ACK=1,seq=y,ack=x+1;
  3. 客户端收到服务器端的确认后再次确认,ACK=1,seq=x+1, ack=y+1;
    C++小白成长记(面试基础之计算机网络,更新中)

TCP如何提供可靠连接:

  1. 校验,与UDP一样,通过伪首部(累计和与取反码)来确认收到的报文是否正确;
  2. 序号,给字节编序号,以方便后面的确认和重传;
  3. 确认,接收端在接收到字节流或者固定时间内没有收到数据的话,就向发送端发送需要接收的最小序号的字节(发送端可以从缓存中删除已成功发送的字节);
  4. 重传,发送端收到接收端发送的接收请求,或者过长时间没有收到确认,便重新发送未确认的字节流。超时间隔是动态确认的,根据之前收到确认报文的速度进行加权,动态处理;
    附加:客户端持续发送连接请求但是不回应,导致服务器崩溃,解决方法SYN cookie

TCP如何实现流量控制

通过接收方确认时(确认连接或者确认接收)发送的接收窗口大小来进行流量控制

TCP如何实现拥塞控制

  1. 慢开始,从一个报文段长度开始,并指数增长,收到一次确认增长一次
  2. 拥塞避免,到达一定阈值(提前设置好的阈值)后,就开始一个个报文段缓慢增加来替换指数增长,之后如果发送方检测到网络拥塞(必定堵塞,所谦让一些),直接将发送速率降低到初始值1,再进行慢开始;
  3. 快重传,如果连续三次收到对方对同一个报文段的接收请求,说明报文段丢失,不用等待固定时间,直接进行重传;
  4. 快恢复,如果发生了快重传,那可能是网络堵塞也有可能是丢包,所以不用太过激进,进行快恢复即可,不是直接减少到初始情况,而是将发送速率减半处理;

TCP如何断开连接(四次挥手)

  1. 客户端发送断开连接的请求,FIN=1,seq=x;
  2. 服务器端接收到客户端断开连接的请求并确认,ACK=1,ack=x+1,seq=y;
  3. 服务器结束发送的数据后也向客户端发送断开连接的请求,FIN=1,ACK=1,ack=x+1,seq=y;
  4. 客户端接收到服务器端的请求并确认,ACK=1,ack=y+1,seq=x+1;客户端在 2*最长报文段寿命(因为有可能最后一个确认消息失败了) 后关闭客户端,如果再次收到服务器的关闭请求,则再进行第四步;

C++小白成长记(面试基础之计算机网络,更新中)