浏览器发起HTTP请求后经历了什么?

6,567 阅读6分钟

这是我参与更文挑战的第4天,活动详情查看:更文挑战

前言

如果之前要是遇到TCP三次握手的问题

我的回答会是这样:

客户端发起一个连接请求,服务端应答,客户端收到应答后再发送请求给服务端。

但这样明显没答到点上,不知道每次请求应答里面携带的报文内容是什么?

又或是知道SYN、ACK,但每次请求的SYN、ACK是什么?

又为什么TCP握手不是两次、不是四次,而是三次?

奈何大学专业不是计算机,所以之前没接触,只能边搬砖边学习了。

基于这些问题,我读了《TCP/IP详解:卷1》,现在在公众号上分享一下我的笔记。

如有错,麻烦指正,谢谢!!!

TCP/IP概述

分层

网络协议通常分不同的层次进行开发,分别负责不同的通信功能。

TCP/IP通常被认为是一个四层协议系统,

分层作用例子应用层处理应用程序细节Telnet、FTP、SMTP、SNMP传输层为不同主机的应用程序提供端到端的通信TCP、UDP网络层处理分组在网络中的活动,例如分组的选路IP、ICMP、IGMP链路层处理与传输媒介(比如电缆)的物理接口细节设备驱动程序和接口卡

「作为一个非底层架构开发人员,只需要关注传输层和网络层即可」

  • TCP(传输控制协议)提供高可靠性的数据通信,把数据进行分包交给网络层
  • UDP(用户数据包协议)不可靠协议,把数据包分组从一台主机发往另一台主机,不保证数据报能送达

假设在一个局域网内有两台主机都运行FTP协议,那么它们各层的协议如下:

网络层IP提供的是一种不可靠的服务。也就是说,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。

TCP在不可靠的IP层上提供了一个可靠的运输层。为了提供这种可靠的服务,TCP采用了超时重传、发送和接收端到端的确认分组、拥塞控制等机制。

「TCP与UDP的区别」

  • TCP是可靠的,为什么可靠,因为其提供了按序发送并确认、超时重传、发送确认、拥塞控制、流量控制等机制
  • TCP是面向连接的(传输之前要进行三次握手),而UDP不是
  • TCP有状态,UDP无状态
  • UDP是不可靠的

TCP/IP的分层

TCP和UDP是两种最为著名的运输层协议

二者都使用IP作为网络层协议

TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。

ICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。

互联网的地址

互联网的每一个接口都必须有一个唯一的Internet地址(IP地址),IP地址长度为32bit

类型范围A0.0.0.0 ~ 127.255.255.255B128.0.0.0 ~ 191.255.255.255C192.0.0.0 ~ 223.255.255.255D224.0.0.0 ~ 239.255.255.255E240.0.0.0 ~ 255.255.255.255

有三类IP地址:

  1. 单播地址(单个主机)
  2. 广播地址(给定网络上的所有主机)
  3. 多播地址(同一组内的所有主机)

域名系统

在TCP/IP领域中,域名系统(DNS)是一个分布式数据库,由它来提供IP地址和主机名之间的映射关系。

封装

当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当做一串比特流送入网络,每一层收到的数据都要增加一些首部信息。

TCP传给IP的数据单元称作TCP报文段或简称为TCP段,IP传给网络接口层的数据单元被称作IP数据报,通过以太网传输的比特流被称作帧。

UDP数据和TCP数据基本一致,不同的是UDP传给IP的信息单元被称作UDP数据报,UDP的首部长是8字节。

IP首部有个8bit的数值称为协议域,标志数据属于哪一层。1标识ICMP,2标识IGMP,6标识TCP,17标识UDP。

以太网数据帧的物理特性是其长度必须在46~1500字节之间。

例如:一个HTTP请求数据报封装流程是这样的

分用

当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称为“分用”。

HTTP从请求到应答的历程

从上一节的封装和分用,已经大概能推测出从浏览器发起HTTP请求到应答的整体流程了,接下来就用一个图片来详细看一下。

「收到网络数据报的处理流程:」

当一个网络包从一个网口经过的时候,首先看看要不要进行处理。有些网口配置了混杂模式,凡是经过的,全部都需要进行处理。

拿到网络数据包之后,先从buffer中摘掉MAC

如果MAC地址和当前MAC相符,说明是发给本机的,于是摘掉IP,看看到底是发给本机的还是希望从本机转发出去的。

如果IP地址不是本机,就应该转发出去。如果IP地址是本机的,就是发给自己的。

根据IP头里面的标示,拿掉三层的头,进行下一层的处理,判断到底是TCP还是UDP。

假设是TCP,此时Buffer里面没有三层的头,需要查看四层的头,判断是发起还是应答,又或是一个正常的数据报,然后分别处理不同的逻辑。如果是发起或应答,就可能要发送一个回复包;如果是一个正常的数据包,就需要较给上层应用处理。

交给哪个应用?在四层的头里有端口号,不同的应用监听不同的端口号。如果发现浏览器应用在监听此端口,那就发给浏览器。

===============================

我是Liusy,一个喜欢健身的程序员。

获取更多干货以及最新消息,请关注公众号:上古伪神

如果对您有帮助,点个关注、转发就是对我最大的支持!!!谢谢