1.如果一次 RPC 请求应用数据过长,TCP 和 IP 层会怎么处理?
如果报文长度超过 MSS TCP 会对数据分段 分别封装发送,如果在 ip 层超过 MTU 也好对数据包进行分包发送,在接收端 TCP 根据头部的序号进行重新合并。
2.交换空间和虚拟地址的概念
交换空间说硬盘上的交换区或者交换文件,通常虚拟地址说每个进程独有的地址空间,中实际访问过程中会通过虚拟地址到物理地址的变换去访问,虚拟技术使得进程的地址空间大于物理内存时正常运行,交换空间作为虚拟技术的后备硬盘。
3.如果 TCP 连接的对端进程退出,机器掉电或者网络不通分别会发生什么。
如果进程正常退出发生 FIN,客户端收到且读完缓冲区的数据之后会读到 0,就知道对端关闭连接,如果进程是异常退出,服务端收到 TCP 报文会检查连接不存在,发生 RST,然后对端根据错误码知道连接断开。
如果机器掉电或者网络不通,可以通过 TCP 的 keepalive 确认连接,也可以在应用层采用心跳机制,使用 ping 去测试连接性,然后根据结果去判断,如果连接断开可以重连,丢弃连接等步骤。
手撕一个具有容量的消息队列
首先是要有 mutex
其次是 unique_lock 要有自动锁
condition variable 使用 notify_full.wait(lock,\&(return dq.size()〈cap;});