IOS网络模型
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()
函数,如果没有设置struct timeval的数值就需要填NULL默认是阻塞,监控fd对象的变化。(TCP模型设计可以有:多任务并发、非阻塞异步信号、时间轮询、多路复用等),要注意的点是每次select()执行完是会清空集合的,所以集合需要定义到循环里面,
select()函数示意图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现