文章目录
- 十、网络基础
- 2. IP地址和MAC地址
- 3. 端口号
- 端口号和进程ID
- 4. 网络字节序
- 未完待续
十、网络基础
2. IP地址和MAC地址
IP协议有两个版本,IPv4和IPv6, 用的比较多的都是IPv4。IP地址是在IP协议中,用来标识网络中不同主机的地址;对于IPv4来说,IP地址是一个4字节,32位的整数;我们通常也使用 “点分十进制” 的字符串表示IP地址,例如 192.168.0.1 。用点分割的每一个数字表示一个字节,范围是 0 - 255。
在网络通信中,两个主机进行通信,识别主机的就是使用这个IP地址。在网络层的IP协议中,添加到协议报头里就包含源IP地址(本机)和目标IP地址(目标主机)。
MAC地址用来识别数据链路层中相连的节点。长度为48位,6个字节。 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)这个地址相当于网卡地址。网络传输中依据的就是这个地址进行传输。
在数据链路层时,会将当前MAC地址和下一个节点的MAC地址添加到协议报头中。
由于路由器覆盖了不止一个的子网。所以就可以借助路由器这个节点进行不同子网间的主机通信。主机在链路层会把路由器的MAC地址作为目标,将报文借助子网1传输给路由器,路由器会将报文进行解包再封装,修改MAC地址,源MAC地址变成路由器节点的MAC地址,目标MAC地址变成目标主机的MAC地址(可能会重复以上流程),再借助子网2把报文传输给目标主机。
IP地址可以理解为坐公交车时的上车点和目标站,标识地点的。
MAC地址可以理解为上一站和下一站,具有路径性质的地址。
在命令行输入 ifconfig 可以查看当前主机的IP地址和MAC地址。
3. 端口号
端口号(port)是传输层协议的内容。当我们将数据报通过传输层解包给应用层时,由于应用层中有大量的进程,其中大部分进程都与我们的网络通信无关,我们应该把数据报传输给指定进程。如何识别这个进程呢?我们使用的就是 端口号 。
网络通信的本质,其实是进程间的通信,看到的公共资源就是 —— 网络。
IP地址标识唯一主机 + port端口号标识唯一进程 = 互联网中唯一的进程。
端口号是一个2字节16位的整数,端口号用来标识一个进程,告诉操作系统当前的这个数据要交给哪一个进程来处理。一个端口号只能被一个进程占用。
端口号和进程ID
有人认为,进程ID就可以标识唯一进程,为什么我们要使用端口号呢?因为进程ID是操作系统的理论,端口号是网络方面的理论,如果同一使用进程ID,那么耦合程度就高了,我们要避免不同模块之间的过度耦合。其次,在操作系统中,每个进程都有自己的pid,但不是每个进程都有port。而且,一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定。
4. 网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?
发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。
接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。
因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。
TCP/IP协议规定:网络数据流应采用大端字节序,即低地址高字节。
不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据。
如果当前发送主机是小端,就需要先将数据转成大端;否则就忽略,直接发送即可。
为使网络程序具有可移植性,使同样的代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数。
例如 htonl 表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回。
如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。