网络数据传输的流程
1、假设从主机A传输数据到主机B的业务需求?
网络数据传输是非常复杂的,在这个过程中遇到的问题也是比较多的,因为网络传输的过程会通过一个接着一个的网络设备,可能会出现数据丢失,那么就需要重新来请求对应的数据,有时候遇到延迟,但是相关设备任务丢失了相关数据,重复请求,出现了数据重复的问题…
面对复杂的场景、网络传输的就将传输的过程划分为不同的层级关系,使得每层专注于处理自己所负责的部分,在每层之间通过接口的形式来进行数据的传递,从而简化复杂的网络数据传输过程。
网络分层模型
HTTP协议
超文本传输控制协议(HyperText Transfer Protocol),他是基于TCP协议的应用层的传输协议,是建立客户端与服务端传输数据的一种规则。
HTTP协议,本身是一种无状态的传输协议,他不会去保存传递的数据,HTTP协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这样做的目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务, 提高效率。
HTTP请求头
HTTP响应头
HTTP请求
在HTTP请求中,包含了请求行,请求头,请求体三个部。
- 请求行:由请求Method、URL、HTTP Version三部分构成, 总的来说请求行就是定义了本次请求的请求方式, 请求的地址,以及所遵循的HTTP协议版本
- 请求头:由一系列的键值对组成,允许客户端向服务器端发送一些附加信息或者客户端自身的信息,具有拓展性,允许用户自己定义请求头。
- 请求体:在发送POST请求时才会有请求正文,GET方法并没有请求正文。
常见的请求报头
GET http://client2.cmread.com/cmread/portalapi?contentId=510105670&start=1&count=1&versionCartoon=4 HTTP/1.1
recmd_version: 8.11.0
Host: client2.cmread.com
Connection: Keep-Alive
Accept-Language:zh-cn
Accept-Encoding: gzip
User-Agent: okhttp/3.12.1
常见的请求方法
HTTP响应
HTTP响应也由三部分组成,包括状态行,消息报头,响应正文。详情如上图所示。
常见的响应状态码如下:
HTTP协议详情参考链接
一个HTTP请求的分层解析流程
- 首先是浏览器进行工作,校验我们的请求行是否正确合法,合法以后会进行DNS的域名解析。
- DNS域名解析,首先会在浏览器的缓存中查看是否有该域名对应的IP,如果没有,则会访问本地计算机是否缓存了该域名的IP,还没有就会去访问域名服务器进行ip的获取。
- 获取以后,通过三次握手,建立tcp链接;
- 确认链接无问题以后,发送http请求到服务器,服务器根据请求头与请求实体进行相应的操作以后,返回响应数据给浏览器。
- 浏览器解析相关参数,渲染到页面上。
- 没有请求与响应结束以后,就会通过四次挥手,断开tcp链接。
TCP传输控制协议
面向连接的,可靠的,基于字节流的传输层通信协议。
特点:
- 基于连接的,再进行数据传递之前需要先建立相关链接。例如三次握手
- 全双工的,数据可以双向传递。
- 字节流,不限制数据的大小,可以打包的形式进行数据的传递,打包成报文段,但需要保证有序接收,重复则需要去重处理。
- 流量缓冲,解决两端处理数据能力不一致的问题。
- 可靠性,保证了数据的可达性,如果发生了丢包那么就会触发重发机制。
- 拥塞控制。网络环境较差,可以自动修改报文大小与速率。
报文组成
三次握手
目的:
- 同步通信双方的初识序列号
- 协商tcp的通信参数
流程
- 首先让服务器处于监听的状态,例如web服务监听80端口。
- 客户端处于SYN-Sent状态进行消息发送,会在本地生成一个数据结构,包含了链接的端口号,目的端口号,目的ip,序号,应答号,对方窗口大小,自己窗口大小,缓冲区等。发送标识为SYN的报文信息,并且随机生成seq序列化。
- 服务器接收以后,改变其状态,同时在自己的本地也会生成一段数据,保存了基本的信息,如客户端,接着就会发送SYN报文,请求客户端的应答,并且会自动生成一个seq,同时(也可以分开来执行)发送ACK应答客户端请求链接的报文信息,在请求的seq的值上+1,在传递给客户端,用作客户端进行标识。
- 客户端在接受服务端的请求以后,就会执行返回一个ACK的报文信息应答服务器,至此双方完成三次握手,建立了通信链接。
内核
整个过程是由操作系统内核进行维护的,它维护了两条队列,一个是SYN队列,就是进行握手链接时,会将数据体存储在该队列当中,建立连接以后,就会将该信息出队,放在accept队列中,进行通信链接的维护。
实例操作
查看TCP通信的状态linux命令
netstat -tpn
//可以查看当前linux的tcp通信的状态 具体使用 netstat -help
linux抓包
//查看对应的网卡
ifconfig
//监听那个网卡的3306端口号,抓3个包就停止
tcpdump -i eth0 -S -c 3 port 3306
四次挥手
但tcp通信关闭的时候会进行四次挥手,具体流程如下
- 首先,关闭链接请求是通过双方都能主动进行的,下面就以主动请求关闭链接为客户端进行说明。
- 客户端请求关闭以后,会发送一个fin的报文给到服务器,并且携带对应的seq给服务器。
- 服务器接收fin的请求以后,就会响应一个ACK给,并且将seq加1,此时服务端进入一个close_wait的状态。客户端在接收响应以后就会进入fin_wait2的状态。
- 服务器发送fin报文给到客户端,请求关闭链接,客户端收到以后,会进入到time_wait(2msl)的状态,并且返回接收信息给服务器,服务器接受以后就会关闭连接。
请求关闭链接方为什么最后会等待2msl再关闭呢?
首先2msl,指的的是报文在tcp链接通道传递一个来回的时间。
原因:1、接收方在等待发送方发送ACK报文,而无法进入关闭状态进行的重发机制,可以被发送方读取到。2、清空tcp通道中要传回给发送方的数据,避免了客户端端口以后被其他应用占据时出现的数据紊乱问题。
字节流协议
TCP把应用交付的数据当作成一组没有任何结构的字节流数据,tcp并不知道这段字节流的一个含义;tcp也不关心应用程序将多大的报文传递给tcp的缓存中,而是它会根据对方给出的窗口值以及当前网络来决定每一个报文应该包含多少个字节。
HTTPS
http协议是明文传输的,传输的链路完全透明,用户可以在任何一个节点对数据进行截获与篡改,数据具有不可信,https就是为了解决这样的问题。
https协议在加密算法之上建立起来的。
例如,常见的md5
HTTPS传输流程