网络请求过程
- 域名解析
首先搜索浏览器自身的DNS缓存,未找到,那么Chrome会搜索操作系统自身的DNS缓存,还未找到,那么尝试读取位于C:\Windows\System32\drivers\etc下的hosts文件,未找到,浏览器首先会找TCP/IP参数中设置的本地DNS服务器,如果要查询的域名包含在本地配置的区域资源中,则完成域名解析,否则根据本地DNS服务器会请求根DNS服务器 -
TCP的三次握手
ACK ,TCP协议规定只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。
SYN,在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1,因此SYN置1就表示这是一个连接请求或连接接受报文
FIN,用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接
三次握手.png
(1)首先由Client发出请求连接即 SYN=1 ACK=0,TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x。
(2)然后 Server 进行回复确认,即 SYN=1 ACK=1 seq=y,ack=x+1。
(3)再然后 Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1,seq=x+1, ack=y+1。
第三次握手的作用:
防止已失效的连接请求报文传到服务器,可能因为网络节点长时间滞留,于是客户端重新发了一条请求报文,第一条请求报文就失效,当服务器接收到已失效的报文时,因为客户端又发了一个新的连接请求,于是向客户端发送确认报文,如果没有第三次握手,只要服务器确认,连接就建立了,但是客户端不会发送数据,所以导致服务器资源浪费
- 建立TCP连接后发起HTTP请求
TCP三次握手建立连接成功后,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个具有标准格式的HTTP响应给客户端。
HTTP请求格式:
HTTP请求格式如下所示四部分组成,分别是请求行、请求头、空行、消息体,每部分内容占一行。
请求行(Request Line)分为三个部分:请求方法、请求地址 和 协议及版本,以CRLF(\r\n)结束。
请求头(Header)可用于传递一些附加信息,格式: 键: 值,注意冒号后面有一个空格!如
请求体的3种形式:
1.请求体是任意类型
2.要求就是URL中Query String的格式要求:多个键值对之间用&连接,键与值之前用=连接,且只能用ASCII字符,非ASCII字符需使用UrlEncode编码。
3.请求体的请求体被分成为多个部分,文件上传时会被使用,这种格式最先应该是被用于邮件传输中,每个字段/文件都被boundary(Content-Type中指定)
分成单独的段,每段以-- 加 boundary开头,然后是该段的描述头,描述头之后空一行接内容,请求结束的标制为boundary后面加--
区分是否被当成文件的关键是Content-Disposition是否包含filename,因为文件有不同的类型,所以还要使用Content-Type指示文件的类型,如果不知道是什么类型取值可以为application/octet-stream表示该文件是个二进制文件,如果不是文件则Content-Type可以省略
4.服务器响应HTTP请求
TTP响应消息的格式包括:状态行、响应头、空行、消息体。每部分内容占一行。
![](https://img.haomeiwen.com/i14945598/ef616421bb7ca4f0.png)
(1)当客户端没有东西要发送时就要释放连接的时候(注意这里首先提出中断连接端可以是Client端,也可以是Server端),客户端会发送一个FIN为1的没有数据的报文,进入FIN_WAIT状态,服务器收到后会给客户端一个确认,这时客户端那边不再发送数据信息(但仍可接收信息)。
(2)客户端收到服务器的确认后进入等待状态,等待服务器请求释放连接。 服务器数据发送完成后就向客户端请求连接释放(也是用FIN=1 表示,并且用ack = u+1(如图)), 客户端收到后回复一个确认信息,又要进入 TIME_WAIT 状态(等待2MSL 时间,最大报文生存时间)。服务器收到后关闭连接。
最后这里为什么还要等待呢?是防止最后一个ACK的丢失,服务器在超时后会重新发送FIN。如果客户端这时收到FIN就知道最后一个ACK丢失了,会重发。否则客户端等待一段时间后依然没有收到回复,则证明Server端已正常关闭,那好,我客户端也可以关闭连接了
- 浏览器解析html代码,并请求html代码中的资源
HTTPS
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。
(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)Web服务器利用自己的私钥解密出会话密钥。
(6)Web服务器利用会话密钥加密与客户端之间的通信。
![](https://img.haomeiwen.com/i14945598/717afe61bbde10a5.gif)
问题:
1.为什么要配置第三方机构的证书
在服务器返回公钥的时候有可能被掉包,所以,我们不能直接将服务器的公钥传递给客户端,而是第三方机构使用它的私钥对我们的公钥进行加密后,再传给客户端。客户端再使用第三方机构的公钥进行解密。如果能解密,就说明这个公钥没有被中间人调包。因为如果中间人使用自己的私钥加密后的东西传给客户端,客户端是无法使用第三方的公钥进行解密的。
浏览器和操作系统都会维护一个权威的第三方机构列表(包括它们的公钥)
2.数字签名的作用
解决同一机构颁发的不同证书被篡改问题,第三方机构不可能只给你一家公司制作证书,它也可能会给中间人这样有坏心思的公司发放证书。这样的,中间人就有机会对你的证书进行调包,客户端在这种情况下是无法分辨出是接收的是你的证书,还是中间人的。因为不论中间人,还是你的证书,都能使用第三方机构的公钥进行解密,证书上写着如何根据证书的内容生成证书编号。客户端拿到证书后根据证书上的方法自己生成一个证书编号,如果生成的证书编号与证书上的证书编号相同,那么说明这个证书是真实的
计算机网络
![](https://img.haomeiwen.com/i14945598/99fab324068659b5.png)
低三层为通信子网,负责数据传输
高三层为资源子网,相当于计算机系统,完成数据处理;
![](https://img.haomeiwen.com/i14945598/628b92e9144f95c7.png)
TCP / IP
含了一系列构成互联网基础的网络协议,是Internet的核心协议 & 被广泛应用于局域网 和 广域网
属于 传输层通信协议
基于TCP的应用层协议有HTTP、SMTP、FTP、Telnet 和 POP3
特点:
![](https://img.haomeiwen.com/i14945598/74d578858e949e70.png)
优缺点
优点:数据传输可靠
缺点:效率慢(因需建立连接、发送确认包等)
可用于:传输文件:HTTP、HTTPS、FTP等协议;传输邮件:POP、SMTP等协议
报文段格式:
TCP虽面向字节流,但传送的数据单元 = 报文段
报文段 = 首部 + 数据 2部分
![](https://img.haomeiwen.com/i14945598/b53a92ad62a86851.png)
对比于UDP,TCP的传输是可靠的、无差错的
为什么TCP的传输为什么是可靠的、无差错的呢?
先理解2个基础概念:发送窗口、接收窗口:
![](https://img.haomeiwen.com/i14945598/1330d756a3bd5b3c.png)
发送端:
1.每收到一个确认帧,发送窗口就向前滑动一个帧的距离
2.当发送窗口内无可发送的帧时(即窗口内的帧全部是已发送但未收到确认的帧),发送方就会停止发送,直到收到接收方发送的确认帧使窗口移动,窗口内有可以发送的帧,之后才开始继续发送
具体如下图:
![](https://img.haomeiwen.com/i14945598/db4f989c7e6468d5.png)
接收端:
当收到数据帧后,将窗口向前移动一个位置,并发回确认帧,若收到的数据帧落在接收窗口之外,则一律丢弃
![](https://img.haomeiwen.com/i14945598/e54bd60d356bbfe3.png)
核心思想:采用一些可靠传输协议,使得
如何实现无差错传输:
出现差错时,让发送方重传差错数据:即 出错重传
当接收方来不及接收收到的数据时,可通知发送方降低发送数据的效率:即 速度匹配
针对上述2个问题,分别采用的解决方案是:自动重传协议 和 流量控制 & 拥塞控制协议
针对差错数据:自动重传请求协议ARQ
ARQ的三种类型:
1.停等式ARQ(Stop-and-Wait):
发送窗口大小=1、接收窗口大小=1,发送方每发送一帧,要等到接收方的应答信号后才能发送下一帧,接收方每接收一帧,都要反馈一个应答信号,表示可接下一帧,若接收方不反馈应答信号,则发送方必须一直等待
2.后退N帧协议
发送窗口大小>1、接收窗口大小=1
a. 发送方:采用多帧滑动窗口的原理,可连续发送多个数据帧 而不需等待对方确认
b. 接收方:采用 累计确认 & 后退N帧的原理,只允许按顺序接收帧。具体原理如下:
![](https://img.haomeiwen.com/i14945598/7f8b8c51cd0864cc.png)
简单的说,发送方会连续发送多个帧,但是接收方只按照顺序接收数据帧,如果有数据帧出错,则后面的数据帧都丢弃,发送方接收不到确认信息,就会重新发送出错帧及后面的帧。
3.选择重传ARQ
发送窗口大小>1、接收窗口大小>1
如何实现流量控制 & 拥塞控制:
1.流量控制:
![](https://img.haomeiwen.com/i14945598/d8146f605b9a7e7b.png)
2.拥塞控制:
发送方维持一个状态变量:拥塞窗口(cwnd, congestion window )
(1)慢开始 & 拥塞避免
a.慢开始算法
开始传输时,试探网络的拥塞情况,当主机开始发送数据时,由小到大逐渐增大 拥塞窗口数值(即 发送窗口数值),从而 由小到大逐渐增大发送报文段
b. 拥塞避免 算法
使得拥塞窗口(cwnd)按线性规律 缓慢增长:每经过一个往返时间RTT,发送方的拥塞窗口(cwnd)加1
(2)快重传 & 快恢复
a. 快重传算法
1.接收方 每收到一个失序的报文段后 就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方),而不要等到自己发送数据时才进行捎带确认
2.发送方只要一连收到3个重复确认就立即重传对方尚未收到的报文段,而不必 继续等待设置的重传计时器到期
![](https://img.haomeiwen.com/i14945598/0ab38c9d4d94f9dc.png)
b. 快恢复
当发送方连续收到3个重复确认后,就:
1.执行 乘法减小 算法:把 慢开始门限(ssthresh)设置为 出现拥塞时发送方窗口值的一半 = 拥塞窗口的1半
2.将拥塞窗口(cwnd)值设置为 慢开始门限ssthresh减半后的数值 = 拥塞窗口的1半
3.执行 加法增大 算法:执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
![](https://img.haomeiwen.com/i14945598/ca0a06c92518f6b3.png)
TCP/UDP区别:
![](https://img.haomeiwen.com/i14945598/2abb8767e1742248.png)
Socket
即套接字,是应用层 与 TCP/IP 协议族通信的中间软件抽象层,表现为一个封装了 TCP / IP协议族 的编程接口(API),属于传输层
Socket 与 Http 对比:
Socket属于传输层,因为 TCP / IP协议属于传输层,解决的是数据如何在网络中传输的问题
HTTP协议 属于 应用层,解决的是如何包装数据
Http:采用 请求—响应 方式
Socket:采用 服务器主动发送数据 的方式
Socket 使用流程:
![](https://img.haomeiwen.com/i14945598/4c12dbbf89e326d1.png)
ICMP协议
ICMP报文不是高层协议,而是作为IP层数据报的数据,加上数据报首部,组成IP数据报发出去,更有效地转发IP数据包 & 提高交付成功的机会
网友评论