TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层。
应用层:HTTP
应用层定义应用进程间的通信规则,不同主机的应用进程间如何相互传递报文
HTTP
HTTP 是超文本传输协议,它定义了客户端和服务器之间交换报文的格式和方式,使用TCP作为传输层协议 HTTP是无状态协议,服务器不保存客户信息 HTTP有非持续连接和持续连接,1.1后建立持续连接,一个TCP连接可以被多个请求复用
HTTP报文
1。 请求报文 //TODO看一个具体的 请求行+首部行+空行+实体主体
- 空行用来划分首部与实体
- 请求行:方法+URL+http版本
- 方法:get,post,head,put,delete developer.mozilla.org/zh-CN/docs/… head与get类似,都是获取数据,但是head返回的响应不包含请求对象
GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*
- 响应报文 状态行 + 首部行+实体主体
- 状态行:协议版本字段+状态码+状态信息
- 实体:请求的对象
HTTP/1.0 200 OK //状态行:协议版本字段+状态码+状态信息
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
<html>
<body>Hello World</body>
</html>
200-请求成功、202-服务器端已经收到请求消息,但是尚未进行处理 301-永久移动、302-临时移动、304-所请求的资源未修改、 400-客户端请求的语法错误、404-请求的资源不存在 500-服务器内部错误。
首部行//TODO 解析请求报文
- 请求首部:Accept 可接收媒体资源的类型、Accept-Charset可接收的字符集、Host 请求的主机名
- 响应首部:ETag 资源的匹配信息,Location 客户端重定向的 URL
- 通用首部:通用首部有 Cache-Control 控制缓存策略、Connection 管理持久连接
- 实体首部:Content-Length 实体主体的大小、Expires 实体主体的过期时间、Last-Modified 资源的最后修 改时间。
http1.0 缺点
- “列头阻塞”:默认使用了持久连接,同一个 TCP 连接里面,数据请求的通信次序 是固定的。服务器只有处理完一个请求的响应后,才会进行下一个请求的处理
http/2
- 二进制
- HTTP/2 是一个二进制协议,头信息和数据体都是二进制,并且统称为"帧"。帧的概念是它实现多路复用的基础。
- 多路复用
- HTTP/2 实现了多路复用,HTTP/2 仍然复用 TCP 连接,但是在一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送,避免了"队头堵塞"
- 数据流
- HTTP/2同一个连接里面连续的数据包可能属于不同请求,通过在数据包发送时标记数据流的ID来区分
- 头信息压缩
- http1不带状态,每次都带上所有信息。客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,只发送服务器推送头信息索引号
- 服务器推送
- HTTP/2 允许服务器未经请求,主动向客户端发送资源,http2 下服务器主动推送的是静态资源
http/3
https
- http存在问题:
- 报文明文发送
- 可被第三方截获修改内容
- 存在认证问题
https
https是超文本传输协议,基于http协议,使用TLS/SSL对数据进行加密,防止第三方窃听。 https提供校验机制,信息篡改后双方会立刻发现
TLS/SSL
transport layer
TLS握手
身份验证-》密钥协商-> 加密算法协商
- 客户向服务器发起请求,请求包含:协议版本,一个随机数,客户端支持的加密方法
- 服务端接受请求,确认加密方法,返回:加密方法,服务器证书,一个随机数
- 客户端确认服务器证书有效,发送:新的随机数(用服务器证书里的公钥加密),前面内容的hash值
- 服务器用私钥解密随机数,提供hash值给客户端校验
- 客户端和服务器使用三个随机数生成对话密钥,以后用于对称加密对话信息;对话密钥通过各自的私钥解密
SSL恢复
- sessionID恢复:每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥"。session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。
- 客户端发送服务器在上一次对话中发送过来的session ticket,session ticket是加密的,只有服务器才能解密。
DNS协议,域名系统
DNS(Domain Name System) 协议提供的是一种主机名到 IP 地址的转换服务。域名系统是由分层的DNS服务器组成的分布式数据库,DNS定义了主机查询这个数据库的方式
域名结构
根据域名的层级结构,管理不同层级域名的服务器
主机名.次级域名.顶级域名.根域名
host.sld.tld.root
有域名的起点都是根域名,写作一个点.,放在域名的结尾,通常省略不写
DNS查询:由域名查询IP地址
www.baidu.com
- 发送DNS请求到本地DNS服务器,本地判断是否有该域名的缓存,存在则直接返回
- 不存在缓存,服务器则从根域名服务器查到根域名(.)的顶级域名(.com)服务器的NS地址和IP地址
- 顶级查到次级/一级域名(baidu)的权威域名服务器IP地址列表,向其中一个列表发送请求
我们向本地 DNS 服务器发送请求的方式是递归查询,本地DNS服务器向其他域名服务器请求是迭代查询 图示:
传输层:TCP
传输层协议为不同主机上的不同进程间提供了逻辑通信的功能,为应用层提供网络支撑。传输层只工作在端系统中。
传输层TCP
transmission control protocol TCP是面向连接的、提供可靠数据服务的传输层协议
传输层的数据包大小超过 MSS(TCP 最大报文段长度),就会将数据分成TCP段,中途有分块丢失只需重新发送一个分块
- 端口:传输层对应用接受和传输数据通道的独立标识。对于浏览器(客户端)中的每个标签栏都是一个独立的进程,操作系统会为这些进程分配临时的端口号。
- 传输层的报文中会携带端口号,因此接收方可以识别出该报文是发送给哪个应用
TCP报文
- 源端口号,目标端口号
- 数据包序号
- 确认序列号:确认对方收到(ack+1)
- 状态位:SYN,ACK,RST,FIN。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更
- 窗口大小:用于做流量控制
三次握手的过程
- 客户端、服务端处于CLOSE状态 -> 服务端主动监听某个端口,处于LISTEN状态
- 客户端主动发起连接SYN,之后处于SYN-SET状态
- 服务端收到后,并且ACK客户端的SYN,并返回,之后处于SYN-RCVD
- 客户端收到SYN和ACK后,为连接分配缓存,发送对SYN确认的ACK,之后处于ESTABLISHED状态
- 服务端收到SYN和ACK后,进入EATABLISHED状态
为什么三次?
三次握手中双方都一发一收,TCP的可靠连接是靠seq(序列号)达成的,三次中,保证双方都会有一次发送自己的、确认对方的序列号
- A发送seqA
- B收到seqA,发送ackA(seqA+1),seqB
- A收到ackA,seqB,发送ackB(seqB+1)
特点
- 面向连接:通信前,双方进行三次握手建立连接
- 通过校验机制提供可靠的数据传输
- 点对点服务:TCP是单个发送方和单个接收方之间的连接
- 全双工服务:通信双方都能收发消息
- 拥塞控制机制:在网络堵塞时TCP会控制发送数据的速率
- 流量控制机制:通信双方发送和接受的数据相同,避免缓存填满造成数据包丢失
- 报文结构:首部+数据
网络层:IP协议
internet protocol
IP协议是网络层协议,负责将数据从一个设备传输到另一个设备,设备用IP地址编号
-
IP地址:网络号+子网掩码
- 网络号:标识IP地址数据哪个子网
- 主机号:标识同一子网下的不同主机
-
将IP地址和子网掩码进行按位与运算,得到网络号
-
将子网掩码取反后,和IP地址进行按位与运算,得到主机号
IP协议将传输层报文作为数据部分,加上IP包头组装成IP报文 寻址过程中,先寻找网络号,然后由路由寻找主机
IP包头 源地址IP和目标服务器IP 协议号:06,标识为TCP
网络接口层:ARP协议,mac地址
网络接口层为网络层提供链路级别的传输服务,负责在底层网络上发送数据包,使用MAC地址来标识网络上的设备
网络接口层在 IP 头部的前面加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上 MAC头部包含了接收方和发送方的mac地址信息(通过ARP协议获得),用于以太网进行寻址
MAC包头 发送方MAC地址,接收方MAC地址
网路接口层单位是帧,网络层是包,TCP是段,HTTP是消息/报文
从键入URL到网页显示
当用户在浏览器输入URL后,首先触发DNS协议解析域名获取服务器IP。DNS查询通过UDP发起,经过递归查询最终返回IP地址。 浏览器随即通过TCP三次握手与目标IP的80端口建立连接。 TCP连接建立后,HTTP协议生成GET请求报文,经TCP分段、添加序列号等处理后,由IP协议封装成数据包进行路由转发。 服务器响应HTML内容通过TCP可靠传输回到客户端,浏览器渲染页面。 应用层(HTTP/DNS)→传输层(TCP)→网络层(IP)。
- 浏览器解析URL www.server.com/目录名/file.ht…... http: 访问数据的协议 //后:web服务器名称 /后:数据源(文件)的路径名
当没有路径名时,就访问根目录下设置的默认文件
- 浏览器根据解析的信息生成http请求(报文)
-
DNS解析服务器域名对应IP 首先发送给本地DNS服务器(客户端的 TCP/IP 设置中填写的 DNS 服务器地址),本地DNS服务器查询缓存,有则直接返回,无则递归查询根域服务器-> 顶层域名 -> 权威DNS服务器 -> 最终IP
-
通过ARP协议获取目标IP地址的MAC地址
如果本地ARP缓存中有IP对应mac,则使用;没有,ARP在以太网中以广播的形式向所有的设备查询IP地址对应的MAC地址
6. 浏览器委托操作系统协议栈通过三次握手与端口建立TCP连接
应用程序调用Socket库委托操作系统的协议栈工作
协议栈TCP,UDP负责接受应用层的委托执行收发数据的操作 协议栈IP控制网络包收发操作
HTTP 是基于 TCP 协议传输的,浏览器通过三次握手与目标IP的端口建立连接
-
如果是HTTPS,通过四次挥手建立TLS连接
-
网卡将网络包转为电信号,通过网线发送
-
交换机根据MAC地址查找端口,发送给路由器;路由器查询路由表,根据IP头部将包转发到服务器
-
服务器查询确认数据包的MAC地址、IP地址、TCP序列号、端口号,将包发送给对应的HTTP进程,返回请求的数据
-
客户端向服务器发起TCP四次挥手,双方断开连接