网络编程(二)
六 网络编程(一)总结
首先对网络编程(一)做个总结:我们现在知道互联网通信其实就是发送数据包与接收数据包.电脑 A 向电脑 B 发送一个数据包, B 收到然后回复一个数据包,才实现了电脑之间的通信.数据包的结构,基本是下图的形式:
想要发送这个数据包需要知道两个地址:
- 对方的 MAC 地址
- 对方的 IP 地址
只有发送方知道这两个地址,数据包才可以准确的发送到接收方.之前已经了解,单纯的 MAC 地址是有局限性的,就是只能在一个局域网内通过MAC 地址通信,如果两台计算机不在一个局域网,那么只能发送给网关( gateway),由网关走路由协议发送给对方.
上图中,1号狄电脑想要个4号电脑通信.首先需要知道对方电脑的 IP 和子网掩码,然后通过 ARP 协议计算出自己和对方的网络号,然后判断是否处于同一个局域网,不是的话,1号电脑将数据包发给网关 A. 网关 A 通过路由协议,发现4号电脑位于网络 B, 又把数据包发给网关 B, 网关 B 再转发给4号电脑.
1号电脑想要把数据包发给网关 A, 首先必须知道网关 A 的 MAC 地址.所以,数据包的目标地址,实际上分为两种情况:
场景 | 数据报地址 |
---|---|
同一个局域网 | 对方的 MAC 地址,对方的 IP 地址 |
非同一个局域网 | 网关的 MAC 地址,对方的 IP 地址 |
发送数据包之前,电脑必须判断对方与自己是否处于同一个局域网,然后选择相应的处理方式来发送数据包.
四 首次联网相关设置
一 静态IP 设置
当我们购买了一台新电脑时,插上网线,开机,这时候电脑能够上网吗?说到这想到我大二干的一件蠢事,那时候不知道路由器的工作原理,以为买了路由器就可以连无线网上网了,然后兴冲冲在网上买了一个路由器,收到货之后插上电,插上网线,发现 WiFi 倒是出现了,可是连上却没有反应,然后我就想啊,不对啊怎么连不上网?之后我想明白了,我 TM 的根本就没装宽带,哪来的网.好在那个路由器也没闲着,终于在去年服役了...
当购买的新电脑连上网线时,通常需要做一些设置,一般现在都会自动设置 IP, 子网掩码 DNS 服务器啦,但是也有有手动设置的,一般会设置四个参数:
- 本机 IP 地址
- 子网掩码
- 网关 IP 地址
- DNS IP 地址
看看 linux 系统的设置
这四个参数缺一不可,由于这是给定的,计算机每次开机都会分到同样的 IP 地址,所以这种情况称为静态 IP 地址上网.
但是这样的设置比较专业,而且不够灵活.所以大多数用户使用动态 IP 地址上网.
二 动态 IP 地址上网
所谓动态 IP 地址,值得是计算机开机后,会由服务器自动分配一个 IP 地址,不需要人为设置.使用的协议为 动态主机设置协议(Dynamic Host Configuration Protocol,DHCP) 协议,是一个局域网的网络协议,使用 UDP协议工作,主要有两个用途:
- 用于内部网或网络服务供应商自动分配 IP 地址给用户;
- 用于内部网管理员作为对所有计算机作中央管理的手段.
这个协议规定,每一个局域网中,有一台计算机负责管理本网络的所有 IP 地址,它叫做DHCP 服务器.新的计算机加入网络,首先必须向 DHCP 服务器发送一个 DHCP 请求数据包,申请 IP 地址和相关的网络参数.
前面说过,如果两台计算机在同一个局域网,必须知道对方的 MAC 地址和 IP 地址,才能发送数据包.但是新加入的计算机并不知道这两个地址,怎么发送数据包呢?这就是 DHCP 的功劳了.
三 DHCP 协议
首先, DHCP 是应用层协议,建立在 UDP 之上的,数据包是这样的:
- 最前面的以太网标头,设置发送方(本机)的 MAC 地址和接收方( DHCP)的 MAC 地址.前着就是本机网卡的 MAC 地址,后者这时候并不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF.这个地址是具有特殊意义的MAC 地址.
- 后面的 IP 标头,设置发送方的 IP 地址和接收方的 IP地址.这时候,对于这两者,本机都不知道.于是发送方的 IP 地址就设为0.0.0.0,接收方得 IP 地址设为255.255.255.255.
- 最后的 UDP 标头,设置发送方的端口和接收方的端口.这一部分是 DHCP 协议规定好的,发送方为68端口,接收方为67端口.
数据包内容构造完成后,就可以发包了.以太网是基于广播方式发送的,同一个局域网的每个计算机都会收到这个数据包.因为接收方的 MAC 地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台计算机收到数据包后都会进行拆包才能确定是不是发给自己的.当看到发送方 IP 地址为0.0.0.0,接收方是255.255.255.255时, DHCP 服务器知道,哦,原来这个包是发给我的,所以其他的计算机就可以丢弃这个包了.
于是 DHCP 服务器读取数据包内容,分配好 IP 地址,发送一个 DHCP 响应数据包.这个是数据包的结构和上面是类似的,以太网标头的 MAC 地址是双方的网卡地址, IP 标头的 IP 地址是 DHCP 副武器的 IP 地址(发送方)和255.255.255.255(接收方),UDP 标头的端口是67(发送方)和68(接收方),分配给请求端的 IP 地址和本网络的具体参数则包含在 Data 部分.
新加入的计算机收到这个响应包,于是就知道了自己的 IP 地址,子网掩码,网关地址和DNS 服务器地址.
四 小结
这是联网的第一步,不管是静态 IP 地址还是动态 IP 地址,想要连上互联网,需要确定这四个参数:
- 本机 IP 地址
- 子网掩码
- 网关 IP 地址
- DNS IP 地址
只有这四个参数确定了,才可以愉快的进行网络冲浪.那么当我们访问网页的时候,互联网协议是如何工作的呢?
五 访问网页
一 本机参数
假定经过上一节的步骤,用户设置好了自己的网络参数:
- IP 地址:192.168.2.238
- 子网掩码:255.255.255.0
- 路由器(网关地址):192.168.2.1
- DNS 服务器:192.168.2.1
打开浏览器访问谷歌,在地址栏输入 www.google.com,这意味着,浏览器向 google 发送一个网页请求的数据包.
二 DNS 协议
我们知道,向谷歌发送一个数据包,必须要知道对方的 IP 地址.但是现在只知道一个网址,并不知道它的 IP 地址.
DNS 协议可以帮助我们,将这个网址转换成 IP 地址,已经知道我们的 DNX 服务器为192.168.2.1,于是向这个地址发送一个 DNS 数据包(53端口).
然后, DNS 服务器作出相应,告诉我们谷歌的地址是174.36.196.242.于是我们知道了对方的 IP 地址.
三 子网掩码
接下来需要判断该 IP地址和本机是否处于同一个局域网,这就需要子网掩码来进行 AND 位运算.
已知子网掩码是255.255.255.0,本机用子网掩码和自己的 IP地址192.168.2.238,做一个二进制的 AND 运算,计算结果为192.168.2.0,然后对谷歌的 IP 地址也做一个 AND 运算,计算结果为174.36.196.0.两个结果不相等,所以结论是谷歌与本机不在一个局域网.
因此我们想要和谷歌通信的话需要通过网关转发,网关地址为192.168.2.1,也就是所接收方得 MAC 地址是网关的 MAC 地址.
四 应用层协议
浏览网页用的是 HTTP/HTTPS 协议,这两种协议的数据构造差不多:
HTTP部分的内容,类似下面这样:
假定这个部分的长度为4960字节,它会被嵌在 TCP 数据包中.
五 TCP 协议
TCP 数据包需要设置端口,接收方( Google)的 HTTPS默认是443,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775.
TCP 数据包的标头长度为20字节,加上嵌入 HTTPS 的数据包,总长度为4980字节.
六 IP 协议
然后, TCP 数据包再嵌入 IP 数据包.IP 数据包需要设置双方的 IP地址,这是已知的,发送方是192.168.2.238(本机),接收方为174.36.196.242( Google).
IP 数据包的标头长度为20字节,加上嵌入的 TCP 数据包,总长度变为5000字节.
七 以太网协议
最后, IP地址数据包嵌入以太网数据包.以太网数据包需要设置双方的 MAC 地址,发送方为本机的网卡 MAC 地址,接收方为网关192.168.2.1的 MAC 地址(通过 ARP 协议获得)
本机的 MAC 地址:
网关的 MAC 地址:
以太网数据包的数据部分,最大长度为1500字节,而现在的 IP 数据包长度为5000字节.因此, IP 数据包必须分割成四个包.因为每个包都有自己的标头(20字节),所以四个包的 IP 数据包的长度分别为1500,1500,1500,560.
八 服务端响应
经过多个网关的转发, google 服务器收到了四个以太网数据包.
根据 IP 标头的序号, google 将四个包拼起来,取出完整的 TCP 数据包,然后读取里面的 HTTPS 请求,接着做出 HTTPS 响应,再用 TCP 协议回复一个数据包.
本机收到 HTTPS 响应以后,就可以将网页显示出来,完成以一次网络通信.