(1) 解析网址,生成一个HTTP报文
(2)必要的话,需要进行DNS查询,将域名翻译成IP地址
- 如果在代码或者数据包中就指定的是IP地址而不是域名,那么这一步可以省略
- 到目前为止,数据包有了,目的IP有了,接下来要做的就是将数据包发出去了
(3)HTTP底层是TCP,会通过socket接口接收到应用程序发送来的数据包。所以接下来的步骤是:
- 先进行三次握手,建立连接
- 然后生成TCP数据包
- 注意在生成数据包的时候,如果数据长度超过MTU,那么需要将这个数据长度按照MSS的单位进行拆包
- MTU:最大报文长度,由链路层决定,以太网是1500
- MSS:值为【MTU-TCP头部-IP头部】
- 拆分出来的每一块数据都会被放进单独的网络包中。也就是在每个被拆分的数据加上TCP 头信息,然后交给 IP 模块来发送数据
- 注意在生成数据包的时候,如果数据长度超过MTU,那么需要将这个数据长度按照MSS的单位进行拆包
- 生成数据包之后,就可以把这个包交给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广播查询
- 还记得我们之前由一个目的IP地址吗,通过
(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头摘下来,看看到底是丢弃、转发还是自己留着