先来谈谈汽车行业,随着家庭轿车的普及,越来越多的人开始使用汽车,其中99%人可能只会开车,不会修理汽车,也不了解汽车内部构造(细节),但这并不影响我们使用汽车。
而对于汽车维修工程师,很显然要精通汽车的内部构造,非常资深的工程师可以通过汽车的声音来定位故障点,这依靠的是多年的经验。而对于初入行的年轻工程师,如果只是看汽车的维修手册,即使看千遍也不一定会维修汽车。经常去4S店看到维修工将受损严重的汽车大卸八块,有时还会有老师傅在边上指导,通过这些动手操作,加上师傅的指导,再去参考维修手册,要不了多久就会很熟练地维修汽车,这样的模式:动手 + 理论 + 师傅指导 同样也适用于计算机网络的学习。
对于99%用户也不需要懂计算机网络,电脑、手机可以自动上网,即使有什么问题,通过插拔线、重启电脑、重启无线路由器基本上可以解决90%以上的问题。但是做为一位网络专业人士,则需要精通计算机网络的工作原理,精通原理可以帮助非专业人士提供专业的服务。
TCP/IP协议不是计算机网络的全部,但TCP/IP协议涵盖了OSI参考模型的第三层、第四层,即网络层、传输层。TCP/IP也不是只有TCP + IP这两种协议,它是协议栈的统称,至少它还包括 ARP,ICMP,IGMP,UDP,以及让域名访问成为可能的DNS,以及电脑/手机可以自动获取IP地址的DHCP。当然还有形形色色的应用层的协议如 HTTP / SMTP / FTP 等。
回到问题本身,《TCP/IP协议》详解卷一,是一本很好的教材,但是光看书有用吗?效果很差,因为这本书有点难度的。不动手不会有感性认识,然后读者会被抽象的概念弄的越来越迷糊,觉得越来越无聊,最终扔掉书,因为我干过好多次,然后过段时间又捡起来…
既然光看书很无聊,那就动动手吧。那时工作在国企,公司网络和互联网隔绝,QQ也无法使用,于是我就按照 Visual C++教程编写了聊天小程序(基于TCP socket ),把这个小程序给楼下的同事,无聊的时候就聊聊天,比如什么时候去吃午饭,下班什么时候撤?在程序启动的时候我就开始抓包,想看看究竟聊天内容怎么封装?究竟几个包完成发送任务?
封装倒很简单,让我惊讶的是,一条消息竟然双向耗费9个包,百撕不得其解,不就是调用一次 connect()建立连接,调用一次 send(),然后程序退出。
TCP建立连接于是就去翻书,这次有针对性,直接翻到TCP协议部分,只看TCP如何建立连接,发现建立连接需要三个包的交互,这个应该是connect()完成的。
TCP发送数据然后看到自己的消息内容是一个包,对方没有数据,只有确认ACK,这是两个包,这个由 send () 触发。
TCP释放连接然后系统自动退出,虽然我的程序没有调用什么函数,但是系统自动帮我调用了 close () 函数,于是又触发了TCP 关闭连接,这是四个包。
于是把这三个阶段包的交换加在一起:3 + 2 + 4 = 9 ,哦原来是这样啊,通过这个小程序,再有针对性地看书,觉得很有趣。
后来我又试试用UDP socket 编写聊天程序,直接调用一个函数Sendto() 就可以了(用IP访问),抓包一看,一个消息就是一个包,对方也没有确认,UDP就是加上一个封装头就出去了,不需要建立连接,自然也无需关闭连接。
后来工作需要编写一个仿真程序,模仿GPS接收设备给导航设备周期(100ms 一次)发送GPS经纬度信息。接口为以太网接口,导航设备有嵌入式操作系统,支持TCP/IP协议栈,有了以前的动手经验,我很快就编写出基于TCP socket 的仿真软件,工作也很正常,但是有时发送数据会有卡顿的现象,时快时慢,有时还会停止发送。于是开始分析网络,办公室网络是交换机口到墙壁,然后用HUB再分出更多的端口,让大家共享带宽。于是想到了 CSMA/CD机制,电脑工作在半双工模式,发送数据前需要监听网络,当网络繁忙时,大家一起竞争,所以会有很大的延迟。
于是又用UDP socket 编写了相同的软件,卡顿现象好多了,后来我分析因为UDP包没有自我约束机制,调用一次sendto() 函数就把数据给IP,IP给网卡,网卡有CSMA/CD机制,会等待,也许会有延迟,也许会因为冲突而丢弃重发、或线路质量差出现CRC错而丢弃,但我的程序不 care,依然会按照100 毫秒发送一组数据,所以我最终选择UDP来做传输机制,丢一组、或几组数据没有多少关系,只要能把经纬度数据传送过去就可以了。
写了这些故事想表达的是:学习协议一定要动手,最好是结合项目来实践,然后需要补充哪些理论,有针对性地去翻书,对于每一个陌生的协议,需要抓包分析,不要偷懒,一份耕耘,一份收获。
本文来自投稿,不代表天一生活立场,如若转载,请注明出处:http://tiyigo.com/it/37876.html