文章目录
浏览器输入网址之后发生了什么
- DNS域名解析(DNS服务器保存了Web服务器域名和IP的对应关系)
- HTTP协议生成请求报文
- TCP协议将请求报文分割成报文段,进行可靠传输
- IP协议进行分组转发
- TCP协议重组请求报文
- HTTP协议对请求进行处理
网络体系(OSI七层、TCP/IP四层、五层)
IP协议
IPV4
IPv4 地址长度共 32 位,是以每 8 位作为一组,并用点分十进制的表示方式
IPV6
IPv6 地址长度是 128 位,是以每 16 位作为一组,每组用冒号 「:」 隔开
IPV6 相对于 IPV4 首部的改进:
- 取消了首部校验和字段。 因为在数据链路层和传输层都会校验,因此 IPv6 直接取消了 IP 的校
验。 - 取消了分片/重新组装相关字段。 分片与重组是耗时的过程,IPv6 不允许在中间路由器进行分片与
重组,这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。 - 取消选项字段。 选项字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在
IPv6 首部中的「下一个首部」指出的位置上。删除该选项字段使的 IPv6 的首部成为固定长度的
40 字节。
TCP协议
TCP头部信息
TCP头部信息出现在每个TCP报文段中, 用于指定通信的游端端口号、目的端端口号, 管理TCP连接, 控制两个方向的数据流。
序列号(Sequence Number)
在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一
次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。
确认应答号(Acknowledgement Number)
指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序
号以前的数据都已经被正常接收。用来解决不丢包的问题。
控制位
- ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN
包之外该位必须设置为 1 。 - RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
- SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
- FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,
通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。
TCP三次握手
刚开始,服务端和客户端都是出于 CLOSED 状态。先是服务端主动监听某个窗口,出于 LISTEN 状态。
第一次握手:
客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里,之后客户端处于 SYN_SEND状态。
第二次握手 :
服务器发回确认包 (ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。之后服务端处于 SYN_RECV状态。
第三次握手:
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1。
最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。服务器收到客户端的应答报文后,也进入 ESTABLISHED 状态。
即 S Y N 就 是 询 问 : 你 能 听 得 到 吗 ? A C K 就 是 回 到 : 我 能 听 得 到 啊 。 \textcolor{red}{即SYN就是询问: 你能听得到吗? ACK就是回到: 我能听得到啊。} 即SYN就是询问:你能听得到吗?ACK就是回到:我能听得到啊。
为什么是三次握手?
-
三次握手才能阻止重复历史连接的初始化(主要原因)
-
三次连接才可以同步双方的初始序列号
-
三次握手可以避免资源浪费
为什么不是两次或者四次握手?
两次握手,无法阻止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号。
四次握手:三次握手已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
如果两次,那么B无法确定B的信息A是否能收到,所以如果B先说话,可能后面的A都收不到,会出现问题 。
如果四次,那么就造成了浪费,因为在三次结束之后,就已经可以保证A可以给B发信息,A可以收到B的信息; B可以给A发信息,B可以收到A的信息
TCP四次挥手
四次挥手
A:“喂,我不说了 (FIN)。”A->FIN_WAIT1
B:“我知道了**(ACK)**。等下,上一句还没说完。Balabala……(传输数据)”B- >CLOSE_WAIT | A->FIN_WAIT2
B:”好了,说完了,我也不说了(FIN)。”B->LAST_ACK
A:”我知道了(ACK)。”A->TIME_WAIT | B->CLOSED
A等待2MSL,保证B收到了消息,否则重说一次”我知道了”,A->CLOSED
这样,通过四次挥手,可以把该说的话都说完,并且A和B都知道自己没话说了,对方也没花说了,然后就挂掉电话(断开链接)了 。
TCP和UDP区别
HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!
TCP常用于 FTP 文件传输,HTTP/HTTPS,UDP常用于总包较少的通信,如 DNS、SNMP等。
-
连接:UDP是无连接的,发送数据之前无需建立连接,发送数据结束后也无需释放连接。TCP是面向连接的,在发送数据之前需要通过三次握手建立连接,发送数据结束后需要通过四次挥手释放连接。
-
可靠性:TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。UDP 是尽最大努力交付,不保证可靠交付数据。
-
传输方式。TCP 是流式传输,没有边界,但保证顺序和可靠。UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。
-
通信双方:UDP支持一对一、一对多、多对一、多对多的交互通信。TCP连接是点对点(一对一),每一条TCP连接只能有两个端点。
-
拥塞控制、流量控制。TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
-
首部开销:UDP首开销小,只有8个字节。TCP首部是20个字节。
TCP可靠性连接的实现
序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的
-
针对数据包丢失情形,使用重传机制解决
-
针对数据包往返时间长,通信效率就会变低,使用滑动窗口解决
-
发送方不能无脑的发送数据给接收方,要考虑接收方的处理能力。为了避免接收方处理不过来,TCP提供流量控制机制解决。
-
拥塞控制,目的是为了避免发送方的数据填满整个网络。
HTTP协议
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
客户端请求消息
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
服务器响应消息
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
HTTP状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
下面是常见的HTTP状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
HTTP和HTTPS的区别
-
默认端口 :HTTP的URL由“http://”起始且默认使用端口80,而HTTPS的UR由“https://”起始且默认使用端口443。
-
安全性和资源消耗: HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS 运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS高,但是 HTTPS 比HTTP耗费更多服务器资源。
- 对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等。
- 非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。
-
HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
-
HTTPS需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
证书验证,客户端发送一个证书请求个服务器端,服务器端返回证书,客户端对证书进行验证。
交换密钥,使用非对称加密,客户端使用公钥进行加密,服务器端使用密钥解密。
交换数据,使用对称加密的方式对数据进行加密,然后进行传输
HTTP协议中GET和POST方式的区别
Get:请求从服务器获取资源,这个资源可以是静态的文本、页面、图片视频等。
POST:相反操作,向URL指定的资源提交数据,数据就放在报文的 body 中。
参数位置、参数长度、参数编码、TCP数据包
-
参数位置:GET方法参数位置包含在URL,POST方法参数包含在请求主体
-
参数长度:GET方法的URL长度有限度,POST长度没有限制
-
参数编码:GET方法参数编码是ASCII码,POST没有限制
-
TCP数据包:GET方法产生一个TCP数据包,把首部和数据一起发送,POST方法产生两个TCP数据包,先发首部,服务器响应后再发数据
参考:
- 图解网络,小林coding-v2.0
- Linux 高性能服务器编程