1.手写TCP服务和流量控制相关的内容
TCP协议是传输层的有连接协议,是面向连接的,面向连接的本质是收发双方维护一定的数据结构。发送方的发送窗口由接收方的接收窗口和拥塞窗口共同决定,为min(cwnd,rwnd)。
如果设置流量窗口值过小,会导致不能充分利用链路,比如小于往返传输时延RTT乘以发送的带宽,如果流量窗口值过大,比如超过实际大小,会造成接收缓冲区溢出,内存占用过大,并且因为拥塞窗口控制而浪费流量窗口的缓存空间。
流量窗口的大小在实际实现中是根据字节流组件的容量决定的。
2.关于epoll有关的知识
epoll是用来解决IO多路复用的问题,所谓的IO多路复用就是线程不再是等待一个文件描述符的数据到来而是同时监听多个文件描述符。epoll和select以及poll相比更加高效。
select能监听的套接字的数量少于epoll,并且对于监听的文件描述符集合,每次select都要传输到内核,而epoll是在内核中维护要监听的文件描述符集合,不需要每次发送。epoll返回的是发生数据变化的文件描述符而select需要对所有文件描述符遍历判断是否有数据到来,因此epoll的效率也比select和poll更高。
3.关于Webserver的结构
Webserver由主线程负责监听各个连接是否有http请求等数据到来,由工作线程即线程池中的线程对各个连接进行处理,返回请求的结果,主线程和线程池中的工作线程通过工作队列联系起来,推送到队列末尾而线程池线程从队头取任务。
http的解析分成行解析,解析对应的任务以及进行具体的处理。对于每个连接,如果超时了会由主线程进行处理,维护一个增序的链表用来清理过期的连接。定时器是由增序的双向链表实现,每五秒的信号处理函数会使得主线程去处理定时器的链表。
总结,对于项目的理解,很大程度上是经历过拷问之后才更加熟悉的,还是应该在面试之前主动地拷打自己。