计算机网络这部分内容非常重要,尤其是在调试网络程序时,以及优化网络层代码时。然而很多程序员都对网络不够了解。学习计算机网络的难点是每一层内容都很多,很容易一头钻入细节中,而无法归纳出整体框架。在查阅学习中,我发现互联网上大多数文章都是对协议进行深入分析,几乎没有人做串连工作,导致我们似乎看懂了某个协议,或者某一层,但对整个网络还是没有一个系统的了解,因此我写作的目的是帮助大家对网络有个较为系统的认识。书籍推荐《tcp/ip详解卷一》,看不懂多看几遍,自己提炼出来的知识比别人告诉你的更加深刻。
首先我们需要掌握一些前置知识。
mac地址即物理地址,每个网卡拥有的世界上唯一的地址。所以多网卡电脑拥有多个物理地址。
路由器和交换机区别:路由器不同类型网络消息传递,交换机用于同一类型网络(网络号)数据交换
路由器:路由器分为a侧和b侧,a侧对应局域网中的ip地址,也就是常说的内网ip,b侧对应外部IP地址,即常说的公网ip。
主机和路由器的区别:主机只转发自己发的包,路由器转发所有到达的数据包
由于ipv4地址数量有限,随着设备数量的增多,可能会导致ip地址不够分配,nat是为了复用ip地址,nat的广泛使用限制了ipv6的发展。若有一路由器(a侧:192.168.0.1, b侧: 168.0.0.1),路由器a侧有主机pc(129.168.0.5),如果pc和外网交换数据,路由器会通过nat将pc 的源ip地址修改为路由器b侧的ip(168.0.0.1),并且建立有状态映射用于数据定向,然后依次转发给下一路由器(路由器转发过程中不修改数据报的ip,仅修改数据报中的mac地址)。所以我们无法直接通过ip访问另外一个路由器背后侧pc(除非使用内网穿透)。nat想全部讲完,篇幅比较大,如果看不懂,你就当路由器没有nat这一功能即可,不影响下文的理解。
ip协议的目的
ip协议的设计目标是为了跨越不同物理网络(如光纤,wifi)的分组提供交换操作,简单说就是为了消息能够在不同类型的物理网络上传输。
ip地址和mac地址的关系
ip地址是由网络管理员,或者用户分配的地址。ip地址对应唯一mac地址,而mac地址对应的ip地址可能发生变化。如你的电脑连接公司网络时,和你电脑连接家里网络时,ip地址是不一样的。而网卡上的mac地址始终不变。
ip地址
ip地址为32bit的数,为了方便表示,将每8位以一个十进制数表示,并以"."分开。如
ip地址 0xffff ffff 表示为 255.255.255.255
ip地址可划分为网络号+主机号,网络号代表不同网络,主机号代表不同设备
ip地址类型
根据不同方式划分ip地址分为A ,B, C, D, E类其中A,B,C为单播,也即我们平时使用最多的ip地址类型,D为组播,E为保留地址。所以根据设备ip地址我们即可判断出设备位于是一类网络中。下面会对A,B,C类进行分析
由图中可见A类地址以第1个字节为网络号,剩余3个字节为主机号,并取首位(0)做地址类型标识;B类地址以前2个字节为网络号,网络号中取前两位10作为地址类型标记,剩余字节为主机号;C类地址同理。
A,B,C类地址
A类地址网络号范围 0x00 ~ 0x10 00 ,根据首字节可得范围为0 ~ 127
B类网络号起始 0x10 00 ~ 0xC0 00 00, 根据首字节可得范围为128 ~ 191
C类网络号起始0xc0 00 00 ~ 0xE0 00 00, 根据首字节可得范围为192 ~ 223
例子:
若有IP地址 168.128.1.1
168 位于 128~191 可知该主机位于B类网络中,网络号为0xA8 80
小结:A,B,C类地址依次网络号可表示范围增大,主机可表示范围减少。
子网掩码(仅讨论定长子网掩码)
每接入一个新网段,为其分配网络号困难,所以诞生了子网,站点可以把ip地址的主机号部分分出一些bit作为子网Id。子网掩码的作用就是对ip地址取出网络号+子网Id,以此来区分该数据包是发给哪个子网。
ip地址128.32.1.14与子网掩码255.255.255.0相与,得到新的网络号128.32.1.0
子网寻址流程
如图可见有一个站点路由器,两个子网。假设有一个数据报发到路由器,数据包目的ip为128.32.1.14,路由器会选择最匹配的掩码相与,如这里和255.255.255.0相与获得新的网络号为128.32.1.0, 路由器将该数据包发到128.32.1.1端口,再根据主机号14发送给主机pc。
dns 协议可以将ip映射一个域名。若百度域名为www.baidu.com(对应IP125.2.2.2),我们可以通过ip,也可以通过域名访问百度。但使用域名相比直接使用ip地址,需要多一步域名解析,将域名转换为ip地址。一个ip地址可以对应多个域名,一个域名只能对应一个ip地址。
上面简单介绍了相关知识,应该能够帮助你理解下面的流程图。下面将以tcp的sync包为例子,来描述第一个包完整发到目的pc的全过程。
图中字符标识的含义
S : 源ip :
D :目的ip:
s : 源mac地址
d : 目的mac地址
pc : 主机
从上面的流程图你可能会有如下疑问:间接交付中sync包为什么没有发给对应ip的pc?
因为在转发过程中sync包的D被解释为路由器b侧的ip地址了,再经过nat转换后,对应的内网ip自然就不是sync包中的D了。所以该sync包发送不到D对应的pc上。那怎么才能将sync包发送到D对应的pc呢?我们可以将D和某内网ip建立联系,这样通过访问D就可访问到对应的pc了,感兴趣的话可以搜索 内网穿透,花生壳就是一个免费好用的内网穿透工具,可以尝试使用一下。