当Bob给Andy发送了一条消息时,这个过程中发生了什么?
本文只介绍基础功能,如果需要细致了解,请参考https://www.wikipedia.org/
总的来说,是将Bob发送的消息序列化后,从应用层到链接层依次拼接标头,构成一个完整的数据包,在实体层中经过模数转换以电信号的形式发送给Andy。
- 实体层:电路信号的控制、电压范围控制等;
- 链路层:负责编解码电路信号,封装成帧,头部主要有mac地址;
- 网络层:在mac地址基础上,增加IP地址,和简单的校验机制;
- 传输层:用户做传输控制,对应有端口,传输层的主要协议有TCP和UDP;
- 应用层:负责与用户交互。
互联网非常庞大,在无数子网络和计算机中,Bob是如何准确的找到Andy的呢?
以太网规定,连入网络的所有设备,都必须具有网卡接口。因此数据包只要能从Bob的网卡传递到Andy的网卡中,那么就实现了基本的通讯。为了寻找Andy的网卡,我们必须知道:MAC地址 和 IP地址。
这里先介绍几个概念:
- MAC地址:网卡的出厂编号,长度是48个二进制位,通常用12个十六进制数表示。
- IP地址:定义网络地址,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
- 路由协议,是一种指定数据包转送方式的网络协议。Internet网络的主要节点设备是路由器,路由器通过路由表来转发接收到的数据。转发策略可以是人工指定的静态路由、策略路由等方法。
- ARP协议,一种通过IP地址来获取MAC地址的协议,发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个"广播"地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。
通常情况下,Andy的IP地址是已知的,那么就存在两种情况:
1.两人在同一个子网络下,那么我们可以用ARP协议,得到对方的MAC地址。
2.两人不在同一个子网络下,那么事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的网关,让网关通过路由协议去转发。
判断两个IP是否在同一网络,可通过子网掩码和IP地址AND运算,计算结果相同则为同一网络。
有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。
接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?
也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做端口(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
端口是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。
传输层的功能,就是建立端口到端口的通信。相比之下,网络层的功能是建立主机到主机的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做套接字(socket)。有了它,就可以进行网络应用程序开发了。
参考链接:
https://www.wikipedia.org/
http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html