网络:当你键入网址之后,发生了什么

(1) 解析网址生成一个HTTP报文

(2)必要的话,需要进行DNS查询,将域名翻译成IP地址

  • 如果在代码或者数据包中就指定的是IP地址而不是域名,那么这一步可以省略
  • 到目前为止,数据包有了,目的IP有了,接下来要做的就是将数据包发出去了

(3)HTTP底层是TCP,会通过socket接口接收到应用程序发送来的数据包。所以接下来的步骤是:

  • 先进行三次握手,建立连接
  • 然后生成TCP数据包
    • 注意在生成数据包的时候,如果数据长度超过MTU,那么需要将这个数据长度按照MSS的单位进行拆包
      • MTU:最大报文长度,由链路层决定,以太网是1500
      • MSS:值为【MTU-TCP头部-IP头部】
    • 拆分出来的每一块数据都会被放进单独的网络包中。也就是在每个被拆分的数据加上TCP 头信息,然后交给 IP 模块来发送数据
  • 生成数据包之后,就可以把这个包交给IP层处理(现在数据包 = TCP数据包 + HTTP数据包)
  • 补充:如果连接不需要了,那么需要进行四次挥手断开连接

(4)IP包收到TCP发来的数据包之后,就会又包一层,生成一个IP数据包。整个过程需要注意的是:

  • IP包中两个关键字段:本端IP和目的IP,用来进行远程定位(注,TCP包里面有源端口和目的端口,用来区分是哪个程序)
  • IP包中还有一个叫做TTL的字段,TTL生存时间字段设置了数据报可以经过的最多路由数。它指定了数据报的生存时间。TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器就减1。当该字段值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。

(5)接下来就到了数据链路层,这里的一般是以太网。主要工作是给数据包加上 MAC 头部(两点传输)

  • MAC头中有两个关键字段:发送方MAC地址和接收方MAC地址(一个网卡一个MAC地址)
    • 发送方也就是自己的MAC地址。直接从本机的网卡中的ROM中读取出来就可以,MAC地址是在网卡生产时写入到ROM中的。
    • 接收端MAC地址怎么得到了?
      • 还记得我们之前由一个目的IP地址吗,通过ARP协议就可以将IP地址转换为MAC地址
        • 先查询 ARP 缓存,如果其中已经保存了对方的 MAC 地址,就不需要发送 ARP 查询,直接使用ARP 缓存中的地址。
        • 如果查询不到,就ARP广播查询

(6)接下来数据包就不断通过交换机(送别者)到达目的地:交换机的设计是将网络包原样转发到目的地。交换机工作在MAC 层,也称为二层网络设备。

(7)如果目的地址在外网,那就还需要通过路由器

  • 路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址
  • 而交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具有 MAC 地址。
  • 感觉:路由器就像一个很小很小的主机,数据包通过交换机这个跳板在“主机”之间流动

服务器 与 客户端–相互扒皮

在这里插入图片描述

  • 数据包到达服务器之后,服务器会先扒开数据包的MAC头部,查看是否和服务器自己的MAC地址符合,符合就将包收起来
  • 接着扒开数据包的IP头,发现IP符合,根据IP头中的协议项,知道自己上层是TCP协议。
  • 于是,扒开TCP头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个ACK,如果不是就丢弃。TCP头部里面还有端口号,http服务器正在监听这个端口号
  • 于是,服务器自然就知道HTTP进程想要这个包,于是就将包发给HTTP进程。
  • 服务器的 HTTP 进程看到,原来这个请求是要访问一个页面,于是就把这个网页封装在 HTTP 响应报文里。
  • 然后又将这个包发送回去

疑问

网络为什么要分层

因为网络很复杂,复杂的东西都要分层,每一层专做自己的事情,从而将复杂的东西简单化

你一定听过二层设备、三层设备。二层设备处理的通常是MAC层的东西。那我们发送一个HTTP的包,是在第七层工作的,那是不是不需要经过二层设备?或者实际是经过了,二层设备页不处理呢?或者换一种问法,二层设备处理的包里,有没有HTTP层的内容

记住一点:只要是在网络上报的包,都是完整的。可以有下层没有上层,绝对不可能有上层没有下层

TCP发送每一个消息,都会带着IP层和MAC层。因为,TCP每发送一个消息,IP层和MAC层的所有机制都要运行一遍。

也就是说,对于TCP协议来说,三次握手也好,重试也好,只要是想发出去的包,就要有IP层和MAC层,不然是发不出去的。

经常有人问这样一个问题,我都知道那台机器的IP地址了,直接发给它消息就行,要MAC地址干什么?这里的关键是,没有MAC地址消息是发送不出去的。

所以如果一个HTTP协议的包跑在网络上,它一定是完整的。无论这个包经过哪些设备,他都是完整的。

所谓的二层设备、三层设备,都是这些设备上跑的程序不同而已。一个HTTP协议的包经过一个二层设备,二层设备收进去的是整个网络包。这里HTTP、TCP、IP、MAC都有。所谓的二层设备就是只把MAC头摘下来,看看到底是丢弃、转发还是自己留着。所谓的三层设备就是把MAC头摘下来之后,再把IP头摘下来,看看到底是丢弃、转发还是自己留着

https://zhuanlan.zhihu.com/p/95904514

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值