计算机网络面经


TCP可靠性怎么保证?

超时重传、序列号、checksum

超时重传的timeout多大?

$$ RTO = RTT + 4 * RTT_D $$

$$ RTT_D = (1 - \beta) * RTT_D + \beta * | RTT_S - RTT| $$

你来设计会怎么实现?

均值 + 4倍标准差

定时器如何设计?

在实际项目中,一个常用的做法是新起一个线程,专门管理定时器,定时来源使用rtc、select等比较精确的来源,定时器超时后向主要的work线程发消息即可,或者使用timefd接口。

了解Linux内核中定时器的实现吗?

Linux 内核则采用的是 Hierarchy 时间轮算法,Hierarchy 时间轮将单一的 bucket 数组分成了几个不同的数组,每个数组表示不同的时间精度,Linux 内核中用 jiffies 记录时间,jiffies记录了系统启动以来经过了多少tick。

Hierarchy 时间轮的原理大致如下,下面是一个时分秒的Hierarchy时间轮,不同于Linux内核的实现,但原理类似。对于时分秒三级时间轮,每个时间轮都维护一个cursor,新建一个timer时,要挂在合适的格子,剩余轮数以及时间都要记录,到期判断超时并调整位置。原理图大致如下:

img

接收端发现序列号不对会有什么操作?

不回ACK,等超时或者回一个当前按序收到的最大值。

如何保证数据有序?

丢弃不按序的数据包或者把不按序到达的数据包缓存。

TCP三次握手、四次挥手? 为什么不是三次而是四次?

img

因为两边都可以发送数据。所以发一个FIN,收到一个ACK,再等两个MSL就可以关闭了。

输入url之后到页面显示发生了什么?有哪些技术、机制等等?

DNS解析

TCP连接

发送HTTP请求

服务器处理请求并返回HTTP报文

连接结束

我跟你能够视频通话、共享编辑器,里面又有哪些技术、机制?

HTTP GET POST有什么区别?

GET 方法的参数应该放在 url 中,POST 方法参数应该放在 body 中


Author: 蒋璋
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 蒋璋 !