如何学好计算机网络?

Wireshark是应用层的应用,为什么能抓到整个包(包括osi五层模型所有协议信息)?
一个网络包从下到上解析到应用层,不应该只有应用层的数据吗?是怎么保存到例如传输层,网络层信息的呢?
 
Wireshark是一个免费的抓包软件,虽然工作在应用层,以独立进程而存在着,但是Wireshark可以通过调用(Call)底层(数据链路层)的API接口来实现抓包的任务。所以Wireshark可以看到数据链路层、网络层、传输层、应用层的所有明文信息。
问大家一个问题,Wireshark可以抓到Ethernet报文的Preamble以及FCS (Frame Check Sequence)吗?
不可以,不相信的读者可以抓包看看。
为什么呢?
Wireshark所调用的这个底层API接口,提前将Preamble以及FCS剥离了,只留下Ethernet Frame的其它部分给各位抓包的同学看而已。
只要将这个底层API稍稍修改一下,将完整的信息全部提交给用户查看也是可以的。只是这些多余的信息对用户来说,没有什么太大的用处,所以API并没有这样实现。
再问大家一个问题,Inter-Frame Gap所对应的9.6us(10M以太网)时间内,线路的物理层是Idle状态,代表线路空闲状态,这个状态是静默状态(没有信息传输),还是有信息在传输?
这个问题回答Yes or No都是错的。最早以太网在IDLE状态是静默状态,但是后来的100M以及更高速的以太网是有信息在传输的。这个被传输的信息就是Idle Symbol,空闲符号,通信双方有足够的时间来完成时钟恢复(Clock Recovery)
不光数据链路层提供了API接口,TCP/IP(网络层、传输层)也提供了用户API接口。如果它们都不提供API接口,那么TCP/IP的五层接口模型将不复存在。试问,一个不提供外部API接口的模块要它有何用?数据链路层如何与其上的网络层耦连?
但是并不是说,数据链路层只能与网络层耦连,数据链路层当然也可以与应用层耦连,比如数据链路层与Wireshark这个应用程序也是可以耦连的。只要它们互相喜欢,有什么不可以的,“王侯将相宁有种乎“,和谁牵手不是谈恋爱啊?
有时Wireshark抓数据链路层的包,也会遇到窘境,什么窘境呢?一台主机自己与自己的通信,比如127.0.0.1进程之间的通信,wireshark在数据链路层抓不到包,此时怎么办呢?
此时需要将Wireshark与网络层(IP层)耦连起来,就可以抓包了。换句话说,只要Wires hark调用IP层的API接口,就可以完成抓包的任务,因为IP层可以观看到127.0.0.1与127.0.0.1的内部通信。以上概念的理解,特别有助于理解OSI参考模型。
如何学好计算机网络?
公众号的订阅用户,有很大比例的程序员。程序员不学计算机网络也是可以的,程序员通常与代码打交道,只要把调用底层的API函数就可以完成数据的发送与接收。但是慢慢你们会发现,光会调用这些接口函数并不神奇,神奇的是这些接口函数如何触发DNS、TCP、IP、ICMP、UDP、ARP这些抽象接口的和谐共振。并最终在物理层生成数字信号,调制成模拟信号在线路、空气中传输。伴随着传输距离的信号衰减、同信道干扰、信道间干扰、多路径衰减、白噪音混杂在一起,神不知鬼不觉混到了接收方。
接收方通过周期性采样,将扭曲变形的信号放大、快速傅里叶变换、将特定信道的信号提取出来(Symbol),将Symbol映射为0、1串串。然后将这些串串提交给数据链路层。数据链路层处理自己份内之事后,再Callback网络层,网络层拿到了报文之后也是处理自己分内之事,然后再Callback传输层。就这么一层层Callback到应用层。
一个报文到达应用层,历经了千辛万苦,仿佛如唐僧取经一样艰难。任何一道工序都可能出错,都有可能造成报文的夭折。通常报文的夭折,就是丢包。我们对计算机底层网络了解的越深,可以快速定位是那道工序出现了问题或者成为系统的瓶颈。
(0)

相关推荐