计算机网络是一个极为复杂的系统,涉及到大量的应用和协议。学好网络一个是要有网络的环境,能接触到交换机、路由器现实的设备;另外一个就是wireshark这一款软件,这款软件能让你看到网络中微观细节。计算机起网络又是一个很简单的系统,它脱离不了我们的现实世界,网络世界就好比我们现实中的世界一样。下面就谈谈我理解中的基础计算机网络。
1、分层体系结构
五层因特网协议栈,还有一个七层iso osi参考模型,但五层协议是事实上的标准。
-
应用层
应用层是网络应用程序及他们的应用层协议存留的地方。包括很多协议,例如http,smtp,ftp等等。位于应用层的信息分组称为报文(message)。 -
运输层
因特网的运输层在应用程序端点之间传送应用层报文。有两个重要的运输协议,即TCP和UDP。TCP想它的应用程序提供了面向连接的服务。UDP协议向它的应用程序提供无连接服务。我们把运输层分组称为报文段(segment)。 -
网络层
网络层负责将数据报(datagram)的网络层分组从一台主机移动到另外一台主机。网络层包括著名的IP协议。 -
链路层
链接层负责将网络层下来的数据报封装成帧(frame)后,将数据已送到下一个结点。例子包括以太网、WIF等。 -
物理层
物理层的任务是将该帧中的一个一个比特从一个结点移动到下一个结点。
2运输层
UDP
udp是不需要建立连接的传输,所以开销很小,常用的例子是DNS,NFS,RIP等协议都是建立在udp上的。udp的报文段的结构也相当简单,udp的头部8个字节,分别是源端口号、目的端口号、长度(指整个udp报文段的长度,单位是字节)、校验和。
udp就讨论完了,可以使用wireshark看看udp报文段的详细内容。
TCP
tcp是因特网运输层的面向连接的可靠的运输协议,之所以被称为面向连接的,是因为在一个应用进程可以开始向另一个应用进程发送数据之前,这两个进程必须先相互“握手”,它们必须相互发送某些预备报文段,以建立确保数据传输的参数。
在介绍TCP前必须要明白的一些概念。
-
**三次握手:**客户首先发送一个特殊的tcp报文段,服务器用一个特殊的报文段来响应,最后,客户在用第三个特殊报文段作为响应。前两个段不承载有效数据,也就是不包含应用层的数据,而第三个报文段可以承载有效数据。
-
**发送缓存:**一旦建立起连接后,应用数据就被TCP引导到该连接的发送/接受缓存里。发送缓存是在三次握手初期设置的缓存之一。接下来TCP就会从发送缓存内取出一块数据。但有趣的是,并没有规定TCP应何时实际发送缓存中的数据。
-
**最大报文段长度(MSS):**经常可以在wireshark内看到MSS,MSS是maximum segment size,最大报文段的长度,也就是tcp报文段的长度。mss通常根据最大链路层帧长度来设置的,设置改mss要保证一个tcp报文段加上tcp/ip首部长度40字节。以太网具有1500字节的最大传输单元,因此mss的典型值为1460。注意,这里的1460是指报文段内应用数据的最大长度,不包括tcp头部的长度。
tcp报文段的结构与udp一样,首部包括源端口和目的端口号。另外同udp一样,tcp首部也包括检验和字段
- 32比特的序号字段和确认号字段。这应该是头部中最重要的两个字段。
- 16比特的接受窗口字段。用于流量控制。
- 4比特的首部长度字段。标示头部的长度,通常就是20字节。但通过wireshark观察字段的十六进制代码,现实的十六进制5,并不是20。通过百度查询到这里存储的是5-15,5代表的就是最小的头部长度20个字节。因为选项的长度是可以变化的。
- 选项字段。该字段用于发送方与接收方协商最大报文段长度,用作调节因子。(老实说不是很明白)
- 6比特的标志字段。urg用来指示报文段里存在着“紧急”数据。ack用来确实字段中的值有效的,通俗讲就是表示我收到了报文。psh指示接收方应立即将数据交给上层。rst、syn、fin比特用于建立连接和拆除。
序号和确认号
这两个字段是tcp可靠传输的最关键的部分。
序号是建立在传送的数据字节流上的,而不是这个报文段的序号,这个地方是很不好理解的地方。
打个比方,一个应用数据流是有500000个字节组成,其mss是1000字节,那么tcp将为改数据流构建500个报文段,第一个报文段的序号是0,第二个报文段的序号不是2,而是1000,第三个报文段分配的序号是2000,以此类推。
**确认号是指从主机b到达a的报文段都有一个序号,a在收到数据后,期望从主机b收到的下一个字节的序号,通常都是ack+1;**举一个例子,假设主机a已经收到了从主机b发过来的0-500个字节,主机a要向b发送一个报文段,那么在主机a的报文段的确认号就是500+1=501。
三次握手画一张简单的图:
syn就是请求连接的信号,fin就是请求断开的信号。
3网络层
网络层是大家平时接触到、使用的最多的部分,也是最有挑战性的部分。运输层依赖于网络层的主机到主机的通信服务。由于网络层涉及到的内容多且复杂,这里就不讲解。网络层最重要的就是转发和路由选择,讲会放在路由部分详细讲解。
这里主要介绍下网络层的因特网控制报文协议ICMP
ICMP
icmp主要被用来在主机和路由器之间批次沟通信息的作用。诸如ping应用和路由不可达等等,都是建立在icmp协议之上的。
icmp通常被认为是ip的一部分,但从体系结构上讲它是位于ip之上的,因为icmp报文是承载在ip分组中的,类似于tcp一样。这一点使用wireshark可以很清楚的看到。icmp报文有一个类型字段和一个编码字段。
ping:ping程序发送一个icmp类型为8编码0的报文到指定主机。看到这个回显请求,目的主机发送一个类型0编码0的icmp回显回答。
traceroute程序用来跟踪一台主机到世界上任何一台其它主机之间的路由,它是用icmp报文来实现的。
4链路层
链路层是理解计算机网络关键部分。
-
csma/cd
具有碰撞检测的载波侦听多路访问。该技术使用在共享广播链路上。它是以太网广泛采用的协议,概括起来是先听后发,边听边发,碰撞停发,随机重发。这种发生在老式的同轴电缆、集线器网络上,现代网络都是使用的交换机,是无碰撞的,也就没有使用csma/cd。 -
arp地址解析协议
当某适配器要向某些目的适配器发送一个帧时,发送适配器将目的适配器的mac地址插入到该帧中,并将该帧发送到局域网上。交换机收到该帧后,查看arp表,如果有目标地址的端口就将该帧转发过去,如果没有,则向除收到的端口广播该帧出去。适配器收到一个帧后,讲检查该帧的目的ma c地址是否与自己的mac地址相等,相等就留下,不相等就丢弃该帧。
那计算机是如何知道目的ip地址所对应的mac地址呢?
这就需要使用地址解析协议arp。arp要注意的一点是,它只为在同一个子网上的主机和路由器解析ip地址。下面讲讲arp是如何工作的。
每台主机和路由器在其内存中具有一个arp表,这张表包含ip地址到mac地址的映射关系。在主机上输入arp -a命令就可以看到主机上的arp表。现在假设主机222.222.222.220要发送一个数据报给同一个子网上的另一台主机或路由器,发送主机需要获得给定ip地址目的主机的mac地址。如果发送发的主机arp表里有该目的地址,这个任务很容易。但如果没有怎么办?222.222.222.220发送一个arp特殊分组,这个分组包含了发送和接受的ip地址和发送发的mac地址。这个分组放入一个链路层的广播报中,用ff-ff-ff-ff-ff-ff来做目的mac地址。包含该arp查询的帧能被子网上的所有其他适配器找到,并且每个适配器都把在该帧中的目的ip和自己的ip地址相匹配。匹配的主机会给查询主机发送回一个带有自己mac地址信息的arp分组,然后查询主机更新它的arp表。同时交换机也维护一个arp表,更新端口对应的mac地址。
arp到底是一个链路层协议还是一个网络层协议?
一个arp被封装在链路层里,因而在体系结构上位于链路层上。然而,一个arp分组具有包含链路层的地址,因而可以认为是链路层协议。但也包含网络层的ip地址,所以也可以认为是网络层协议。最好把arp看成是跨越链路层和网络层边界的两边的协议。
以上是在一个子网内的情况,那么加入一台主机要向不是一个子网的主机发送数据报该怎么办呢?
如果arp向子网上的主机发送该帧,按所有的主机都将丢弃该帧,因为没有一台主机具有相匹配的ip地址,这个时候,arp的数据只会向路由器地址网关来发送。由路由器来判断目的ip。这也是路由器ip网关的重要作用。arp协议是理解网络很重要的部分,大家一定要反复思考,在日常工作中反复积累。
5物理层
物理层是最底层的部分,在上面跑的只能是bit流0101。物理层只讲一讲交换机和路由器。至于双绞线、光纤大家可以自行查找资料,笔者也不是很懂。
- 链路层交换机和路由器的区别
交换机最主要的任务是将接受入链路层的帧并将它们转发出链路。它对子网中的主机和路由器是透明的。交换机的两大功能过滤和转发。过滤是决定一个帧应该转发出去还是丢弃。转发是决定一个帧应该被导向哪个借接口。交换机的过滤和转发借助于交换机内部的交换机表(switch table)完成。交换机的转发是基于mac地址而不是ip地址。交换机是第二层的分组转发,路由器是第三层的分组交换机。
路由器接口需要配置ip地址,而交换机的接口是即插即用。
至此,网络的分层就介绍完了,以上的内容应该是网络最基本的知识,要想继续深入学习计算机网络,上面的内容必知必会。