终极版:从开机联网到输入一个网址期间都发生了什么?
这一个问题能检验一个人的计算机网络基础知识.
1.获得IP地址
- 想要连接网络需要获得一个IP地址, 所以首先要运行DHCP协议, 从本地DHCP服务器获得一个IP地址以及其他信息.
- 通过操作系统生成一个DHCP请求报文, 并将这个报文放入具有目的端口67(DHCP服务器)和源端口68(本机)的UDP报文段中, 该UDP报文段会被放置在一个具有广播地址(255.255.255.255)和源IP地址为0.0.0.0的IP数据报中.
- 包含DHCP请求报文的IP数据报被放置在以太网帧中. 该以太网帧具有广播目的地址FF:FF:FF:FF:FF:FF和本机的MAC地址00:61:3D:32:86:A8
- 该帧会发送给以太网交换机, 并在所有的输出端口广播该帧.
- 当被广播到DHCP服务器时(运行在路由器中), DHCP服务器为该主机分配IP地址, 并把DNS服务器地址, 默认网关路由器地址, 网络掩码等信息和分配的IP地址一起封装成一个DHCP提供报文发送给主机. 主机确认选择好IP地址后将再次与DHCP服务器通信确认.
- 至此, 我们的主机获得了IP地址与其他网络配置信息, 可以准备打开浏览器上网了.
2.访问网页前的准备
- 假设我们现在要访问博客园, 当我们输入URL:www.cnblogs.com后, 我们的主机需要知道博客园的IP地址才能与博客园的服务器建立TCP连接并发送HTTP请求. 所以下面将描述根据DNS协议完成名字到IP转换的过程.
- 先把URL放入DNS报文中, 再根据DNS服务器端口和地址依次封装为报文段和数据报, 最后放入到以太网帧中, 并将该帧发送到学校(或家庭)的网关路由器.
- 虽然在第4步中已经获得了网关路由器的IP地址, 但不知道其MAC地址. 为了获得网关路由器的MAC地址, 需要使用ARP查询报文. 接着把ARP封装进以太网帧中, 并在以太网中广播, 最终获得网关的MAC地址.
- 有了网关MAC地址后, 承载DNS报文的数据报就能到达DNS服务器了.
- 我们简单假设DNS服务器缓存有www.cnblogs.com的IP地址, DNS服务器会形成一个主机名到IP地址映射的DNS回答报文, 放入到UDP报文段中, 进而封装成寻址到我们能主机的IP数据报, 并通过网络反向传输回我们的主机.
- 这时我们的主机得到了服务器www.cnblogs.com的IP地址, 准备访问www.cnblogs.com服务器.
3.与网站服务器交互
- 有了www.cnblogs.com的IP地址, 下面便生成TCP套接字并通过该套接字向www.cnblogs.com发送HTTP GET报文以获取网站内容. 在生成套接字的同时, 我们主机中的TCP需要和www.cnblogs.com的TCP进行三次握手, 下面开始描述三次握手的过程.
- 主机首先生成一个具有目的端口80的TCP SYN报文段, 将该TCP报文段放到具有目的IP地址的IP数据报中, 继而将数据报放入具有网关路由器MAC地址的帧中, 并向交换机交换该帧.
- 当包含TCP SYN的数据报到达www.cnblogs.com, 服务器从数据报抽取出TCP SYN报文段, 并分解到与端口80相联系的欢迎套接字. 服务器的TCP会与主机生成一个专属套接字, 并产生一个TCP SYNACK报文段, 响应给客户端主机.
- 收到TCP SYNACK后, 我们的主机进入连接状态, 此时来到三次握手的第三阶段, 我方主机需要向服务器发送ACK报文段, 且可以在ACK报文段中放入数据了. 我们把GET报文放入报文段的数据载荷字段, 并发送给服务器.
- 博客园的服务器接收到HTTP GET报文后, 生成一个HTTP响应报文, 并把Web页面的内容放入到报文中, 响应给我们的主机.
- 最后我们的主机读取HTTP响应报文, 抽取出html数据, 并将网页显示在浏览器上.
小结
- 不要小看连网和浏览网页这一能在数秒能完成的操作, 它涵盖了足够多的网络知识, 上面的叙述已经高度简化, 里面的每个操作背后都对应着丰富的知识.
- 想要了解这些动作背后都发生了什么, 最好的方法是系统地看一本讲述网络知识的书. 以上的内容是《计算机网络 自顶向下方法》第六章协议栈结束后所描述的场景. 也是看了这本书后, 才知道平时常用的网络背后蕴含这么多知识.