终极版:从开机联网到输入一个网址期间都发生了什么?

这一个问题能检验一个人的计算机网络基础知识.

1.获得IP地址

  • 想要连接网络需要获得一个IP地址, 所以首先要运行DHCP协议, 从本地DHCP服务器获得一个IP地址以及其他信息.
  1. 通过操作系统生成一个DHCP请求报文, 并将这个报文放入具有目的端口67(DHCP服务器)和源端口68(本机)的UDP报文段中, 该UDP报文段会被放置在一个具有广播地址(255.255.255.255)和源IP地址为0.0.0.0的IP数据报中.
  2. 包含DHCP请求报文的IP数据报被放置在以太网帧中. 该以太网帧具有广播目的地址FF:FF:FF:FF:FF:FF和本机的MAC地址00:61:3D:32:86:A8
  3. 该帧会发送给以太网交换机, 并在所有的输出端口广播该帧.
  4. 当被广播到DHCP服务器时(运行在路由器中), DHCP服务器为该主机分配IP地址, 并把DNS服务器地址, 默认网关路由器地址, 网络掩码等信息和分配的IP地址一起封装成一个DHCP提供报文发送给主机. 主机确认选择好IP地址后将再次与DHCP服务器通信确认.
  5. 至此, 我们的主机获得了IP地址与其他网络配置信息, 可以准备打开浏览器上网了.

2.访问网页前的准备

  • 假设我们现在要访问博客园, 当我们输入URL:www.cnblogs.com后, 我们的主机需要知道博客园的IP地址才能与博客园的服务器建立TCP连接并发送HTTP请求. 所以下面将描述根据DNS协议完成名字到IP转换的过程.
  1. 先把URL放入DNS报文中, 再根据DNS服务器端口和地址依次封装为报文段和数据报, 最后放入到以太网帧中, 并将该帧发送到学校(或家庭)的网关路由器.
  2. 虽然在第4步中已经获得了网关路由器的IP地址, 但不知道其MAC地址. 为了获得网关路由器的MAC地址, 需要使用ARP查询报文. 接着把ARP封装进以太网帧中, 并在以太网中广播, 最终获得网关的MAC地址.
  3. 有了网关MAC地址后, 承载DNS报文的数据报就能到达DNS服务器了.
  4. 我们简单假设DNS服务器缓存有www.cnblogs.com的IP地址, DNS服务器会形成一个主机名到IP地址映射的DNS回答报文, 放入到UDP报文段中, 进而封装成寻址到我们能主机的IP数据报, 并通过网络反向传输回我们的主机.
  5. 这时我们的主机得到了服务器www.cnblogs.com的IP地址, 准备访问www.cnblogs.com服务器.

3.与网站服务器交互

  1. 有了www.cnblogs.com的IP地址, 下面便生成TCP套接字并通过该套接字向www.cnblogs.com发送HTTP GET报文以获取网站内容. 在生成套接字的同时, 我们主机中的TCP需要和www.cnblogs.com的TCP进行三次握手, 下面开始描述三次握手的过程.
  2. 主机首先生成一个具有目的端口80的TCP SYN报文段, 将该TCP报文段放到具有目的IP地址的IP数据报中, 继而将数据报放入具有网关路由器MAC地址的帧中, 并向交换机交换该帧.
  3. 当包含TCP SYN的数据报到达www.cnblogs.com, 服务器从数据报抽取出TCP SYN报文段, 并分解到与端口80相联系的欢迎套接字. 服务器的TCP会与主机生成一个专属套接字, 并产生一个TCP SYNACK报文段, 响应给客户端主机.
  4. 收到TCP SYNACK后, 我们的主机进入连接状态, 此时来到三次握手的第三阶段, 我方主机需要向服务器发送ACK报文段, 且可以在ACK报文段中放入数据了. 我们把GET报文放入报文段的数据载荷字段, 并发送给服务器.
  5. 博客园的服务器接收到HTTP GET报文后, 生成一个HTTP响应报文, 并把Web页面的内容放入到报文中, 响应给我们的主机.
  6. 最后我们的主机读取HTTP响应报文, 抽取出html数据, 并将网页显示在浏览器上.

小结

  • 不要小看连网和浏览网页这一能在数秒能完成的操作, 它涵盖了足够多的网络知识, 上面的叙述已经高度简化, 里面的每个操作背后都对应着丰富的知识.
  • 想要了解这些动作背后都发生了什么, 最好的方法是系统地看一本讲述网络知识的书. 以上的内容是《计算机网络 自顶向下方法》第六章协议栈结束后所描述的场景. 也是看了这本书后, 才知道平时常用的网络背后蕴含这么多知识.

往期推荐:

  1. 写代码解释什么是api,什么是sdk
  2. 飞机大战小游戏全制作过程分享
  3. 仿flappy bird小游戏制作分享
  4. 如何开始编写技术博客?markdown语法入门,分享使人进步
  5. 请求参数、表单参数、url参数、header参数、Cookie参数有什么区别?
posted @ 2019-04-12 08:14  胡涂阿菌  阅读(897)  评论(2编辑  收藏  举报