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时,要挂在合适的格子,剩余轮数以及时间都要记录,到期判断超时并调整位置。原理图大致如下:
接收端发现序列号不对会有什么操作?
不回ACK,等超时或者回一个当前按序收到的最大值。
如何保证数据有序?
丢弃不按序的数据包或者把不按序到达的数据包缓存。
TCP三次握手、四次挥手? 为什么不是三次而是四次?
因为两边都可以发送数据。所以发一个FIN,收到一个ACK,再等两个MSL就可以关闭了。
输入url之后到页面显示发生了什么?有哪些技术、机制等等?
DNS解析
TCP连接
发送HTTP请求
服务器处理请求并返回HTTP报文
连接结束
我跟你能够视频通话、共享编辑器,里面又有哪些技术、机制?
HTTP GET POST有什么区别?
GET 方法的参数应该放在 url 中,POST 方法参数应该放在 body 中