IOS网络模型
应用层: 内核缓冲区内封包(man 3 setsocketopt)
表示层:
会话层:
传输层: TCP头+有效数据
网络层: IP头+TCP头+有效数据
数据链路层: MAC头+IP头+TCP头+有效数据
物理层: 集中器,中继器
ps:TCP支持紧急数据,可以使用send+标记MSG_OOB,可以忽略内核缓冲区的最小值限制直接封包发送。send(fd,buff,MSG_OOB_)
面试提问:TCP时,如果接收端在进行recv阻塞,并把最小水位线变大,在这种情况下客户端给你发了一个紧急数据怎么处理?
答:客户端可以选择发送紧急的带外数据(out of band),此时需要使用send()去发送,然后每次只发送一个字节。
如果server收到了带外数据,则内核会向服务器进程发送一个信号。
面试提问:如果你想避免TCP长时间阻塞怎么做呢?
答:对于超时控制,服务器默认设置是阻塞模式,会阻塞在accept()函数的位置,调用setsockopt()函数进行设置,struct timeval
面试提问:多路复用处理服务器?
答:可以使用select()函数,如果没有设置timeval的数值就需要填NULL默认是阻塞,监控fd对象的变化。(TCP模型设计可以有:非阻塞、异步信号、时间轮询、多路复用等),要注意的点是每次select()执行完是会清空集合的,所以集合需要定义到循环里面,
select() 函数示意图: