您现在的位置是:综合 >>正文
网络编程和web编程
综合37人已围观
简介 凌晨三点,我盯着终端里滚动的日志,一个TCP连接在第三次握手时超时了。抓包工具显示SYN包已经发出,对方却没回SYN-ACK。这不是网络故障,是防火墙把端口封了——但程序里写的明明是“连接失败请重 ...
凌晨三点,网络我盯着终端里滚动的编程编程日志,一个TCP连接在第三次握手时超时了。网络抓包工具显示SYN包已经发出,编程编程对方却没回SYN-ACK。网络这不是编程编程网络故障,是网络防火墙把端口封了——但程序里写的明明是“连接失败请重试”。那一刻我突然意识到,编程编程网络编程和web编程,网络是编程编程两种完全不同的痛苦。
网络编程玩的网络是字节流。你得像快递员一样,编程编程把数据拆成包裹,网络写上源地址和目的编程编程地址,再交给运输系统。网络TCP保证包裹不丢、不乱序,UDP则像扔飞盘,能不能接住全看运气。写socket代码时,脑子里全是状态机:监听、接受、读写、关闭,每个状态都可能出错。最折磨人的是半关闭状态——对方发了FIN包,你还在等数据,这时候read返回0,但你不知道是该清理资源,还是该再等等看有没有残留数据。
Web编程就轻松多了?别急着下结论。HTTP协议把一切都框好了:请求-响应,一个萝卜一个坑。你不需要管TCP的拥塞控制,不用处理粘包拆包,框架帮你把请求解析成对象,把响应渲染成JSON。但web层的坑藏在别处——会话管理。用户登录状态存在哪?Cookie里塞sessionId,Redis里存session数据,一旦分布式部署,session同步就成了噩梦。我见过生产事故:用户A的购物车数据串到了用户B的页面上,就是因为session key在集群间没同步。
两种编程的思维方式也截然不同。网络编程是“面向连接”的,你得假设网络不可靠,随时可能断开。但web编程是“面向资源”的,每个URL就是一个资源,GET是取,POST是造,DELETE是删。这导致很多web程序员写网络层代码时习惯性犯错——他们总想保持一个长连接,然后像调用HTTP接口一样发命令。结果呢?连接断了也不知道,重连逻辑写得乱七八糟。
还有个更隐蔽的区别:性能瓶颈。网络编程的瓶颈在I/O模型上。同步阻塞?一个线程只能处理一个连接,一万个连接就要一万个线程,内存先炸了。用epoll?又得处理事件驱动带来的回调地狱。web编程的瓶颈则在数据库查询上。用户点个按钮,后端要查权限表、查用户表、查订单表,一次请求下来SQL执行了二十多次。你说加缓存?缓存击穿又来了,Redis里没数据,瞬间所有请求打到MySQL上,数据库直接宕机。
当然,两者在现实里早就纠缠不清了。WebSocket就是典型的跨界产物——它走HTTP的握手,但升级成TCP长连接后,又回到了网络编程的领域。写WebSocket服务端时,你既要处理HTTP的握手细节,又要操心心跳包、断线重连、消息边界,两种思维来回切换。我见过最离谱的bug:程序员用web框架的线程池去处理websocket消息,结果线程池满了,所有连接全部卡死——因为websocket连接是长驻的,占着线程不释放。
说到底,网络编程是地基,web编程是装修。地基打得不好,装修再漂亮也白搭。但装修的坑往往比地基更难发现——地基出问题,报错信息里好歹有IP和端口,装修出问题,可能只是页面白屏,控制台连个错误都不打。
如果你让我选,我宁愿调三天三夜的socket,也不想去排查一个“偶尔出现”的跨域请求问题。前者至少能抓包,后者……你只能祈祷用户用的是Chrome,而不是某个内置了奇怪安全策略的浏览器。
Tags:
上一篇:安全渗透测试
下一篇:谷歌核对信息一直转圈
相关文章
反渗透培训课件
综合反渗透培训课件 反渗透膜不是万能的,但它能挡住水中99%的溶解盐、胶体、微生物和有机物。这套技术说白了就是半透膜两侧浓度差驱动水分子逆流,靠高压硬生生把水挤过膜孔,盐离子留下,纯水过去。你看着原理简单 ...
【综合】
阅读更多星空免费ddos压力测试
综合上周三凌晨两点,我挂在《星空》里的采矿驳船突然掉线。重新登录后,舰船已经爆成残骸,货舱里价值三百万ISK的矿石全没了。本地频道里有人刷了句“test complete”,然后退出了游戏。这不是第一次了 ...
【综合】
阅读更多渗透电子书
综合电子书盗版这事儿,很多人以为就是找个网站下载个epub文件那么简单。实际上,背后有一条完整的产业链在运转,而且它比大多数人想象的要隐蔽得多。 我去年想找一本绝版的技术书,纸质版已经炒到三百多,电子版官 ...
【综合】
阅读更多