2026/2/10 12:58:24
网站建设
项目流程
网站建设计入什么费用,课程网站怎么做,揭阳做网站设计,外贸看的英文网站#xff08;一#xff09;TCP、poll、epoll
TCP#xff08;传输控制协议#xff09;
是什么#xff1a;TCP 是一种面向连接、可靠的网络传输协议。它把要发送的大块数据切成一个个“小段”#xff08;称为报文段#xff09;#xff0c;并在发送前为每段加上序号。接收方…一TCP、poll、epollTCP传输控制协议是什么TCP 是一种面向连接、可靠的网络传输协议。它把要发送的大块数据切成一个个“小段”称为报文段并在发送前为每段加上序号。接收方收到后会给发送方回送确认ACK如果发送方在一定时间内没有收到确认就会重新发送该段。通俗比喻想象你在写信寄快递每封信都有编号收件人收到后会回一张收据。如果寄出的信件丢了你会再寄一遍直到收到收据为止。开发实例在 C/C 中使用socket()、connect()、send()、recv()等系统调用即可实现基于 TCP 的客户端/服务器。例如一个最简单的回显服务器会在recv()读取到客户端发来的数据后直接用send()把相同的数据返回给客户端。poll轮询是什么poll是一种I/O 多路复用的系统调用。它让一个进程一次性监视多个文件描述符如套接字、管道、文件等的状态是否可读、可写、异常等并在有任意一个描述符准备好时返回。通俗比喻想象你是老师要检查一堆学生的作业是否完成。你一次性把所有作业本都摆在桌子上等到有学生把作业交上来你立刻看到并批改而不必一个一个去叫学生。开发实例在 Linux 下使用struct pollfd数组把所有要监听的套接字放进去然后调用poll(pfds, nfds, timeout)。返回后遍历数组找到revents标记为可读或可写的套接字进行相应的recv()/send()操作。structpollfdfds[2];fds[0].fdlisten_fd;// 监听套接字fds[0].eventsPOLLIN;// 关注可读事件新连接fds[1].fdclient_fd;// 已连接的客户端fds[1].eventsPOLLIN;// 关注可读事件收到数据intretpoll(fds,2,-1);// 阻塞等待if(fds[0].reventsPOLLIN){/* accept new connection */}if(fds[1].reventsPOLLIN){/* recv data */}epoll高效的 I/O 多路复用是什么epoll是 Linux 为了解决poll/select在大规模并发场景下性能瓶颈而推出的专用机制。它采用事件驱动的方式只在真正有状态变化的文件描述符上触发回调避免每次轮询都遍历全部描述符。通俗比喻继续老师的例子。如果班里有几千名学生你不可能每次都把所有作业本都搬到桌子上检查。于是你让每个学生在作业完成后主动把作业本递到老师面前老师只需要处理递来的作业本效率大大提升。开发实例使用epoll_create1()创建 epoll 实例epoll_ctl()把感兴趣的套接字加入或删除监视集合epoll_wait()阻塞等待事件。返回的事件数组只包含真正有活动的套接字。intefdepoll_create1(0);structepoll_eventev,events[10];ev.eventsEPOLLIN;// 关注可读事件ev.data.fdlisten_fd;epoll_ctl(efd,EPOLL_CTL_ADD,listen_fd,ev);while(1){intnepoll_wait(efd,events,10,-1);for(inti0;in;i){if(events[i].data.fdlisten_fd){// 有新连接intconnaccept(listen_fd,NULL,NULL);ev.eventsEPOLLIN;ev.data.fdconn;epoll_ctl(efd,EPOLL_CTL_ADD,conn,ev);}else{// 已连接的客户端有数据可读charbuf[1024];ssize_tcntread(events[i].data.fd,buf,sizeof(buf));// 处理数据...}}}小结名称作用适用场景关键特性TCP可靠的点对点数据传输需要保证数据完整性文件传输、网页请求等连接、序号、确认、重传poll同时监视多个 I/O 对象的状态连接数不多、代码简单的服务器每次调用遍历全部描述符epoll高效监视大量 I/O 对象高并发服务器成千上万连接只返回活跃描述符性能更好二TCP、http、sse、wss、mqtt通讯协议对比一、基本概念通俗版名称所在层次关键特性典型使用场景TCP传输层OSI 第 4 层面向连接、可靠、全双工、基于字节流、通过三次握手/四次挥手建立和关闭连接文件传输、网页请求、任何需要保证数据不丢失的场景HTTP应用层基于 TCP请求‑响应模型、无状态、默认端口 80HTTPS 443支持 GET/POST 等方法浏览器访问网页、REST API、静态资源下载SSEServer‑Sent Events基于 HTTP 的单向推送服务器单向向浏览器推送文本/JSON自动重连使用普通 HTTP或 HTTPS长连接新闻、股票行情、系统通知等只需要服务器“推送”而不需要客户端回传的实时更新WSSWebSocket Secure基于 TCP 的全双工协议加密版在 WebSocketws://之上加入 TLS/SSL 加密URL 以wss://开头提供双向实时通信在线聊天、实时协作、游戏等对安全有要求的双向交互MQTT基于 TCP可选 TLS 的轻量级发布‑订阅协议采用 Broker 中转支持 QoS 0/1/2报文头极小适合低带宽、低功耗设备物联网传感器、远程监控、移动端轻量消息推送二、技术对比与选型指南传输可靠性 vs 交互模式TCP提供可靠的点对点传输是所有上层协议HTTP、WebSocket、MQTT的基石。HTTP只负责一次请求‑响应适合“拉取”数据的场景。SSE在 HTTP 长连接上实现单向推送代码只需在浏览器端new EventSource(url)不需要自己维护心跳或重连逻辑。WebSocket / WSS实现全双工通信客户端new WebSocket(url)服务器可以随时主动发送也能随时接收客户端消息。MQTT采用发布‑订阅模型客户端不直接相互通信而是通过 Broker 进行主题topic转发天然支持多对多广播。性能与资源消耗SSE只支持文本JSON数据协议开销极小适合数千级别的单向推送[[6]]。WebSocketWSS在保持一个 TCP 连接的前提下能够以毫秒级延迟双向传输适合高频交互聊天、游戏[[7]]。MQTT报文头只有 2‑4 字节QoS 机制可以在网络不佳时自动重传或丢弃极其适合成千上万的物联网设备[[8]]。安全性HTTP→HTTPSTLS可加密WebSocket→WSS同理使用wss://即可在传输层提供加密[[9]]。SSE也可以通过 HTTPShttps://实现加密只是协议本身不自带加密层。MQTT支持基于 TLS 的MQTTSmqtts://在需要机密传输的工业场景中常用。典型开发示例代码片段TCPCintsocksocket(AF_INET,SOCK_STREAM,0);connect(sock,(structsockaddr*)addr,sizeof(addr));send(sock,hello,5,0);recv(sock,buf,sizeof(buf),0);close(sock);HTTPcurlcurl-X GET https://api.example.com/usersSSE浏览器constesnewEventSource(/sse/price);es.onmessageeconsole.log(price:,e.data);WebSocket / WSS浏览器constwsnewWebSocket(wss://chat.example.com);ws.onopen()ws.send(JSON.stringify({type:join,room:1}));ws.onmessageeconsole.log(msg:,e.data);MQTTJavaScript PahoconstclientnewPaho.MQTT.Client(broker.example.com,8883,web_Math.random());client.connect({useSSL:true,onSuccess:(){client.subscribe(sensor//temp);}});client.onMessageArrivedmsgconsole.log(msg.topic,msg.payloadString);选型小结场景推荐协议说明普通网页请求、REST APIHTTP/HTTPS简单请求‑响应易于缓存、CDN只需要服务器单向实时推送新闻、监控SSEHTTPS实现最简单自动重连浏览器原生支持双向实时交互且对延迟敏感聊天、协作、游戏WebSocket / WSS全双工、低延迟安全版使用 WSS大量低功耗设备、需要主题广播、带 QoSMQTTMQTTS轻量、发布‑订阅、可伸缩适合物联网需要可靠的点对点传输文件、流媒体TCP配合上层协议为上层协议提供可靠通道三、总结TCP是所有网络通信的可靠基石。HTTP基于 TCP适合一次性请求‑响应。SSE在 HTTP 长连接上实现单向推送代码最简。WSS是加密版 WebSocket提供全双工实时通信并保证安全。MQTT采用轻量的发布‑订阅模型专为海量物联网设备设计。根据业务需求单向推送 vs 双向交互、设备规模、带宽限制、安全要求在上述协议中挑选最合适的即可实现高效、可靠的网络通信。三python实现示例一、TCP传输控制协议概念TCP 是面向连接、可靠的传输层协议。发送方把要发送的字节流切成若干报文段每段都有序号接收方收到后会回送ACK确认发送方若在超时时间内未收到 ACK 就会重新发送该段。这样可以保证数据不丢失、顺序不乱。Python 示例客户端fromsocketimport*server_name127.0.0.1# 服务器 IPserver_port12000# 服务器端口clientsocket(AF_INET,SOCK_STREAM)client.connect((server_name,server_port))msginput(输入一句话)client.send(msg.encode())# 发送replyclient.recv(1024).decode()# 接收print(服务器返回,reply)client.close()Python 示例服务器fromsocketimport*PORT12000serversocket(AF_INET,SOCK_STREAM)server.bind((,PORT))# 监听所有网卡server.listen(1)print(服务器已启动等待连接…)whileTrue:conn,addrserver.accept()dataconn.recv(1024).decode()conn.send(data.upper().encode())# 把收到的内容转成大写再回传conn.close()二、poll 与 epollI/O 多路复用poll一次性把多个文件描述符套接字、文件等放进pollfd数组调用poll()后内核会检查哪些描述符已经准备好可读、可写、异常返回后只处理这些“活跃”的描述符。适用于几百到几千个连接但每次调用都要遍历整个数组。epollLinux 专有采用事件驱动只在真正有状态变化的描述符上触发回调内部使用红黑树 双向链表避免每次遍历能够轻松支撑上万甚至上百万并发连接。Python 示例使用select.pollimportsocket,select listensocket.socket()listen.bind((0.0.0.0,9000))listen.listen()pollerselect.poll()poller.register(listen.fileno(),select.POLLIN)whileTrue:eventspoller.poll()forfd,flaginevents:iffdlisten.fileno():conn,_listen.accept()poller.register(conn.fileno(),select.POLLIN)else:connsocket.fromfd(fd,socket.AF_INET,socket.SOCK_STREAM)dataconn.recv(1024)ifdata:conn.send(becho: data)else:# 客户端关闭poller.unregister(fd)conn.close()Python 示例使用select.epollimportsocket,select listensocket.socket()listen.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)listen.bind((0.0.0.0,9001))listen.listen()epselect.epoll()ep.register(listen.fileno(),select.EPOLLIN)whileTrue:forfd,eventinep.poll():iffdlisten.fileno():conn,_listen.accept()ep.register(conn.fileno(),select.EPOLLIN)else:connsocket.fromfd(fd,socket.AF_INET,socket.SOCK_STREAM)dataconn.recv(1024)ifdata:conn.send(becho: data)else:ep.unregister(fd)conn.close()三、HTTP超文本传输协议概念基于 TCP 的请求‑响应协议。客户端浏览器或程序发送GET/POST等请求服务器返回状态码 报文体。在 AI 业务中常用来提供RESTful API让前端或其他服务通过 HTTP 调用模型推理接口。Python 示例Flask 简单 HTTP 服务fromflaskimportFlask,request,jsonify appFlask(__name__)app.route(/hello)defhello():namerequest.args.get(name,World)returnfHello,{name}!app.route(/predict,methods[POST])defpredict():datarequest.json# 前端发送的 JSON# 这里可以调用模型进行推理示例直接回显result{input:data,output:dummy_result}returnjsonify(result)if__name____main__:app.run(host0.0.0.0,port5000)# 运行在 5000 端口四、SSEServer‑Sent Events概念在 HTTP 长连接上单向推送数据的技术。服务器端返回Content-Type: text/event-stream随后不断发送data: ...\n\n格式的文本。浏览器端使用EventSource接收适合实时监控、日志推送、股票行情等只需要服务器主动推送的场景。Python 示例Flask 实现 SSEfromflaskimportFlask,Responseimporttime appFlask(__name__)defevent_stream():i0whileTrue:i1yieldfdata: 计数{i}\n\n# 每秒推送一次time.sleep(1)app.route(/counter)defcounter():returnResponse(event_stream(),mimetypetext/event-stream)if__name____main__:app.run(threadedTrue)# 必须开启多线程浏览器端HTML仅示例实际使用时放在前端页面scriptconstesnewEventSource(/counter);es.onmessageeconsole.log(服务器推送,e.data);/script五、WSSWebSocket Secure概念在 HTTP/HTTPS 端口上升级为全双工的WebSocket连接ws://为明文wss://为 TLS 加密版。建立一次握手后客户端和服务器都可以随时主动发送二进制或文本帧延迟通常在毫秒级。适用于聊天、实时协作、在线游戏、AI 推理流式返回如 ChatGPT 的流式输出。Python 示例使用websockets库# server.pyimportasyncio,websocketsasyncdefecho(ws,path):asyncformsginws:awaitws.send(f回显{msg})start_serverwebsockets.serve(echo,0.0.0.0,8765,sslNone)# 若要 wss传入 ssl.SSLContextasyncio.get_event_loop().run_until_complete(start_server)asyncio.get_event_loop().run_forever()# client.pyimportasyncio,websocketsasyncdefhello():asyncwithwebsockets.connect(ws://127.0.0.1:8765)asws:awaitws.send(你好服务器)replyawaitws.recv()print(服务器说,reply)asyncio.get_event_loop().run_until_complete(hello())如果需要wss加密只需在websockets.serve与websockets.connect中传入ssl参数使用ssl.SSLContext加载证书即可。六、MQTTMessage Queuing Telemetry Transport概念轻量级的发布‑订阅协议基于 TCP可选 TLS。客户端publish消息到某个topicBroker 再把该 topic 的所有subscriber推送过去。报文头只有几字节非常适合物联网、边缘设备、实时数据流。Python 示例使用paho-mqtt# publisher.pyimportpaho.mqtt.clientasmqtt brokerbroker.hivemq.com# 公共测试 brokerclientmqtt.Client()client.connect(broker,1883,60)client.publish(demo/temperature,payload23.5,qos0)print(已发布温度 23.5)client.disconnect()# subscriber.pyimportpaho.mqtt.clientasmqttdefon_message(client,userdata,msg):print(f收到主题{msg.topic}:{msg.payload.decode()})brokerbroker.hivemq.comclientmqtt.Client()client.on_messageon_message client.connect(broker,1883,60)client.subscribe(demo/temperature)client.loop_forever()# 持续监听适用场景TCP需要可靠、顺序的数据传输文件、数据库同步。poll/epoll服务器需要同时管理大量长连接epoll在高并发下性能最佳。HTTP一次性请求‑响应适合REST API、模型推理的同步调用。SSE服务器单向推送实时更新客户端不需要发送数据如日志、监控面板。WSS全双工、低延迟适合聊天、协作编辑、流式 AI 输出。MQTT轻量、主题广播适合IoT 设备、边缘计算、海量传感器数据。小结适用场景对照可靠点对点→TCP如文件传输、远程调用大量并发、需要高效轮询→epoll高并发 Web 服务、游戏服务器一次性请求‑响应→HTTPRESTful API、模型同步推理服务器单向推送→SSE实时监控、新闻推送全双工实时交互→WSS聊天、协作、流式 AI轻量发布‑订阅→MQTT物联网、传感器网络、实时数据分发