七层网络协议
tcp,udp
TCP简介
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的传输层协议。它确保数据包按顺序且无误地传送到接收方。TCP的主要特性包括:
-
连接建立:TCP是面向连接的协议,这意味着在发送数据之前,通信双方需要先建立一个连接。这通常通过“三次握手”机制完成。
-
第一次握手:客户端向服务器发送一个SYN(同步序列号)包,请求建立连接。
-
第二次握手:服务器收到SYN包后,回复一个SYN-ACK包,确认收到请求,并向客户端发送自己的SYN请求。
-
第三次握手:客户端收到服务器的SYN-ACK包后,发送一个ACK包确认收到服务器的请求。此时,连接建立完成,双方可以开始数据传输。
-
-
可靠性:TCP确保数据的可靠传输。每个数据包都有一个序列号,接收方会发送确认包(ACK)确认收到数据。如果发送方没有在规定时间(有定时器)内收到确认包,它会重新发送数据包。
-
流量控制:TCP使用流量控制机制,确保发送方不会淹没接收方,避免网络拥塞。
-
拥塞控制:TCP采用各种拥塞控制算法(如慢启动、拥塞避免、快速重传和快速恢复)来管理网络拥塞。
四次挥手
-
第一次挥手: Client端发起挥手请求,向Server端发送标志位是FIN报文段,设置序列号seq,此时,Client端进入
FIN_WAIT_1
状态,这表示Client端没有数据要发送给Server端了。 -
第二次分手:Server端收到了Client端发送的FIN报文段,向Client端返回一个标志位是ACK的报文段,ack设为seq加1,Client端进入
FIN_WAIT_2
状态,Server端告诉Client端,我确认并同意你的关闭请求。 -
第三次分手: Server端向Client端发送标志位是FIN的报文段,请求关闭连接,同时Client端进入
LAST_ACK
状态。 -
第四次分手 : Client端收到Server端发送的FIN报文段,向Server端发送标志位是ACK的报文段,然后Client端进入
TIME_WAIT
状态。Server端收到Client端的ACK报文段以后,就关闭连接。此时,Client端等待2MSL的时间后依然没有收到回复,则证明Server端已正常关闭,那好,Client端也可以关闭连接了。
为什么四次挥手
确保数据在关闭过程中能够被完整传输,同时也允许延迟的数据包在关闭后仍然能够被接收
UDP简介
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、简单的传输层协议。与TCP不同,UDP不提供数据包的顺序保证或重传机制。UDP的主要特性包括:
-
无连接性:UDP的无连接特性使得数据可以快速传输。发送方无需等待接收方的响应,可以直接发送数据报。这种机制减少了延迟,但也带来了数据包丢失的风险。
-
不可靠性:UDP不提供数据包的顺序保证,也不处理丢失的数据包。
-
低延迟:由于UDP的简化机制,它的传输延迟较低,非常适合实时应用。
-
数据报分组:UDP将数据分割成小的数据报,每个数据报独立传输。
TCP的应用场景
TCP适用于需要高可靠性和数据顺序保证的场景:
-
文件传输:如FTP和HTTP,文件传输需要确保数据的完整性和顺序性,TCP的可靠传输机制非常适合。
-
电子邮件:SMTP协议基于TCP,确保邮件内容完整无误地传输到收件人。
-
远程登录:如SSH和Telnet,远程登录需要保证命令的顺序执行和响应的正确性,TCP能够提供这种保障。
UDP的应用场景
UDP适用于对传输速度要求较高、容忍一定数据丢失的场景:
-
视频流媒体:如YouTube和Netflix,视频流媒体对数据传输的实时性要求高,UDP能够减少延迟,提高用户体验。
-
在线游戏:游戏中的实时交互对延迟非常敏感,UDP的低延迟特性使其成为在线游戏的首选。
-
DNS查询:DNS查询需要快速响应,UDP的简单机制能够满足这一需求。
tcp 的可靠性怎么保证
TCP确保数据的可靠传输。每个数据包都有一个序列号,接收方会发送确认包(ACK)确认收到数据。如果发送方没有在规定时间(有定时器)内收到确认包,它会重新发送数据包。
TCP协议是如何保证可靠传输的,有哪些机制?
TCP协议主要通过以下几点来保证传输可靠性:连接管理、序列号、确认应答、超时重传、流量控制、拥塞控制。
-
连接管理:即三次握手和四次挥手。连接管理机制能够建立起可靠的连接,这是保证传输可靠性的前提。
-
序列号:TCP将每个字节的数据都进行了编号,这就是序列号。序列号的具体作用如下:能够保证可靠性,既能防止数据丢失,又能避免数据重复。能够保证有序性,按照序列号顺序进行数据包还原。能够提高效率,基于序列号可实现多次发送,一次确认。
-
确认应答:接收方接收数据之后,会回传ACK报文,报文中带有此次确认的序列号,用于告知发送方此次接收数据的情况。在指定时间后,若发送端仍未收到确认应答,就会启动超时重传。
-
超时重传:超时重传主要有两种场景:数据包丢失:在指定时间后,若发送端仍未收到确认应答,就会启动超时重传,向接收端重新发送数据包。确认包丢失:当接收端收到重复数据(通过序列号进行识别)时将其丢弃,并重新回传ACK报文。
-
流量控制:接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,就会导致接收端的缓冲区溢出,进而导致丢包。为了避免上述情况的发生,TCP支持根据接收端的处理能力,来决定发送端的发送速度。这就是流量控制。流量控制是通过在TCP报文段首部维护一个滑动窗口来实现的。
-
拥塞控制:拥塞控制就是当网络拥堵严重时,发送端减少数据发送。拥塞控制是通过发送端维护一个拥塞窗口来实现的。可以得出,发送端的发送速度,受限于滑动窗口和拥塞窗口中的最小值。拥塞控制方法分为:慢开始,拥塞避免、快重传和快恢复。
什么是TCP粘包?
TCP 粘包是指在 TCP 协议传输数据时,出现的一种数据粘连、边界不清晰的现象,就可能导致数据解析错误。例如,原本应该是两个独立的消息,一个是用户登录消息,一个是用户查询消息,由于粘包现象,接收方可能将这两个消息当作一个消息来解析,从而导致登录信息和查询信息混乱,无法正确处理用户的请求。
粘包的问题出现是因为不知道一个用户消息的边界在哪,如果知道了边界在哪,接收方就可以通过边界来划分出有效的用户消息。
一般有三种方式分包的方式:
-
固定长度的消息;
-
特殊字符作为边界;
-
自定义消息结构。
固定长度的消息
这种是最简单方法,即每个用户消息都是固定长度的,比如规定一个消息的长度是 64 个字节,当接收方接满 64 个字节,就认为这个内容是一个完整且有效的消息。
但是这种方式灵活性不高,实际中很少用。
特殊字符作为边界
我们可以在两个用户消息之间插入一个特殊的字符串,这样接收方在接收数据时,读到了这个特殊字符,就把认为已经读完一个完整的消息。
HTTP 是一个非常好的例子。
HTTP 通过设置回车符、换行符作为 HTTP 报文协议的边界。
有一点要注意,这个作为边界点的特殊字符,如果刚好消息内容里有这个特殊字符,我们要对这个字符转义,避免被接收方当作消息的边界点而解析到无效的数据。
自定义消息结构
我们可以自定义一个消息结构,由包头和数据组成,其中包头包是固定大小的,而且包头里有一个字段来说明紧随其后的数据有多大。
比如这个消息结构体,首先 4 个字节大小的变量来表示数据长度,真正的数据则在后面。
struct { u_int32_t message_length; char message_data[]; } message;
当接收方接收到包头的大小(比如 4 个字节)后,就解析包头的内容,于是就可以知道数据的长度,然后接下来就继续读取数据,直到读满数据的长度,就可以组装成一个完整到用户消息来处理了。
HTTPS相对于HTTP有什么优势?
HTTPS 使用 SSL/TLS 协议对数据进行加密。在数据传输过程中,数据会被加密成一串乱码,只有合法的接收方才能使用相应的密钥将其解密还原为原始数据。这就防止了数据在传输过程中被窃取或篡改,保护了用户的隐私和数据安全。比如,用户在进行网上银行转账时,使用 HTTPS 可以确保转账金额、账号等敏感信息不被他人窃取。
还有,HTTPS 要求服务器拥有由权威证书颁发机构颁发的数字证书。客户端在与服务器建立连接时,会验证服务器的证书,以确保连接的服务器是真实可靠的,而不是假冒的。这可以有效防止用户访问到钓鱼网站,避免用户的账号、密码等信息被窃取。
同时,HTTPS 通过数字签名等技术来确保数据的完整性。在数据传输过程中,一旦数据被篡改,接收方就可以通过验证数字签名发现数据的变化,从而拒绝接受被篡改的数据,保证数据的准确性和完整性。
HTTP存在哪些安全问题,HTTPS通过什么机制解决安全问题?
HTTP 由于是明文传输,所以安全上存在以下三个风险:
-
窃听风险,比如通信链路上可以获取通信内容,用户号容易没。
-
篡改风险,比如强制植入垃圾广告,视觉污染,用户眼容易瞎。
-
冒充风险,比如冒充淘宝网站,用户钱容易没。
HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议,可以很好的解决了上述的风险:
-
信息加密:交互信息无法被窃取,但你的号会因为「自身忘记」账号而没。
-
校验机制:无法篡改通信内容,篡改了就不能正常显示,但百度「竞价排名」依然可以搜索垃圾广告。
-
身份证书:证明淘宝是真的淘宝网,但你的钱还是会因为「剁手」而没。
http1.1,http2.0,https
HTTP1.0:
浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接
HTTP1.1:
-
引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用
-
虽然允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的,服务器只有处理完一个请求,才会接着处理下一个请求。如果前面的处理特别慢,后面就会有许多请求排队等着
-
新增了新的请求方法 -------- option、put 、delete
-
新增了一些新的请求头和响应头
HTTP2.0:
-
传输采用二进制格式而非文本格式
-
TCP连接实现多路复用,也不需要有序按照请求次序依次返回
-
使用报头压缩,降低传输开销
-
服务器推送
介绍下 HTTPS 中间人攻击
http是明文传输,并且没有服务器证书验证,https是加密传输,并且有服务器证书验证
https 协议由 http + ssl 协议构成。
HTTP的中间人攻击过程如下:
-
服务器向客户端发送公钥。
-
攻击者截获公钥,保留在自己手上。
-
然后攻击者自己生成一个【伪造的】公钥,发给客户端。
-
客户端收到伪造的公钥后,生成加密 hash 值发给服务器。
-
攻击者获得加密 hash 值,用自己的私钥解密获得真秘钥。
-
同时生成假的加密 hash 值,发给服务器。
-
服务器用私钥解密获得假秘钥。
-
服务器用加秘钥加密传输信息
防范方法: 服务端在发送浏览器的公钥中加入 CA 证书,浏览器可以验证 CA 证书的有效性
HTTPS 通信的具体流程
三次握手是建立TCP可靠通信的, 四次挥手是断开TCP可靠通信的
-
第一步:客户端向服务端发起请求
-
客户端生成随机数R1 发送给服务端;
-
告诉服务端自己支持哪些加密算法;
-
-
第二步:服务端向客户端发送数字证书
-
服务端生成随机数R2;
-
客户端支持的加密算法中选择一种双方都支持的加密算法,也就是生成会话秘钥的算法
-
服务端生成把证书、随机数R2、会话密钥生成算法,一同发给客户端
-
-
第三步:客户端验证数字证书,生成秘钥
-
验证证书合法性,包括证书是否吊销、是否到期、域名是否匹配,通过后则进行后面的流程
-
获取数字证书的公钥、随机数R2、会话密钥生成算法
-
生成一个随机数R3。
-
用服务端证书的公钥加密随机数R3并发送给服务端。
数字证书:主要包含证书发布机构,证书有效期,公钥,证书所有者,签名使用的算法,指纹以及指纹算法。数字证书可以保证里面的公钥一定是证书持有者的。
-
-
第四步:服务器得到会话密钥
-
服务器用私钥解密客户端发过来的随机数R3
-
根据会话秘钥算法使用R1、R2、R3生成会话秘钥
-
-
第五步:客户端与服务端进行加密会话
-
客户端用自己的会话秘钥加密数据后发送给服务端(
客户端加密数据发给服务端
) -
服务端用自己的会话密钥解密客户端发送的数据; (
服务端对加密数据进行解密
) 再用自己的会话密钥把响应的数据加密发送给客户端。(服务端将返回数据加密再发给客户端
) -
客户端用自己的会话密钥解密响应数据;(
客户端解密响应数据
)
-
用了 HTTPS 会被抓包吗?
HTTPS 的数据是加密的,常规下抓包工具代理请求后抓到的包内容是加密状态,无法直接查看。
但是,正如前文所说,浏览器只会提示安全风险,如果用户授权仍然可以继续访问网站,完成请求。因此,只要客户端是我们自己的终端,我们授权的情况下,便可以组建中间人网络,而抓包工具便是作为中间人的代理。通常 HTTPS 抓包工具的使用方法是会生成一个证书,用户需要手动把证书安装到客户端中,然后终端发起的所有请求通过该证书完成与抓包工具的交互,然后抓包工具再转发请求到服务器,最后把服务器返回的结果在控制台输出后再返回给终端,从而完成整个请求的闭环。
既然 HTTPS 不能防抓包,那 HTTPS 有什么意义? HTTPS可以防止用户在不知情的情况下通信链路被监听,对于主动授信的抓包操作是不提供防护的,因为这个场景用户是已经对风险知情。
说说 HTTP1.0/1.1/2.0 、与HTTPS的区别、HTTPS 通信的具体流程-优快云博客
DNS查询
1.客户机(PC)向首选DNS服务器(首选DNS服务器是指当前你的PC机连接的DNS服务器,Windows可以使用ipconfig命令查看)发起请求:”你知道www.benet.com的IP吗?“如果首选DNS服务器知道(一般如果首选DNS服务器曾经解析过,那么会进行一段时间内的缓存,默认三天,如果正好在缓存时间内,那么首选服务器就会知道这个域名的IP),那么首选DNS 服务器就会直接给客户机返回域名的IP 地址
2.若首选DNS 服务器上没有相关信息,就不能直接返回域名的IP 地址,这时候,首选DNS 服务器就会去询问根DNS服务器(所有的DNS 服务器都知道全球的13 台DNS根服务器在哪里),根服务器可能不知道这个具体的 www.benet.com 的IP地址,但是它知道一级域 com 的IP(也就是说根服务器只负责维护所有的一级域,所以也就几百条数据在这里,虽然数据量少,但是它接受来自全球的请求,所以负载也很大)
3.根服务器将com 的IP地址返回给 首选DNS 服务器
4.首选DNS服务器再去请求 "com" DNS服务器:”你知道 www.benet.com的IP吗“,但是com DNS服务器也不知道 www.benet.com 的IP,但是com DNS 服务器知道 benet.com 的IP,
5.”com“DNS服务器将这个信息返回给 首选DNS 服务器
6.首选DNS服务器再去请求 "benet.com" DNS服务器,这时候 benet.com 服务器当然就会知道 www.benet.com的IP地址
7.”benet.com“DNS服务器将这个信息返回给首选DNS 服务器
8.首选DNS 服务器将获取到的 www.benet.com的IP返回给客户机
9.客户机根据获取到的www.benet.com 的IP地址来访问WEB服务器
10.WEB服务器返回相关的数据
DNS劫持
通过攻击域名解析服务器(DNS),篡改域名解析结果,使得用户访问目标网站时跳转到其他页面。简单来说,就是网络中的“坏人”把你的网址指向了错误的地址。
拓展:
TCP/IP四层模型
TCP/IP 四层模型是目前被广泛采用的一种模型,由以下 4 层组成:应用层、传输层、网络层、网络接口层
-
应用层(Application Layer)类似于 OSI 模型中的应用层,负责处理用户与网络应用程序之间的通信。它包括诸如 HTTP、FTP、SMTP 等协议,用于实现不同类型的网络服务和应用。
-
传输层(Transport Layer):与 OSI 模型中的传输层相对应,提供端到端的数据传输服务。在 TCP/IP 模型中,主要有两个协议:TCP(传输控制协议)和 UDP(用户数据报协议),用于确保可靠的数据传输和简单的数据传输。
-
网络层(Internet Layer):相当于 OSI 模型中的网络层,负责数据包的路由和转发。它使用 IP(Internet Protocol)协议来定义数据包的传输路径,并处理不同网络之间的通信。
-
网络接口层(Link Layer):与 OSI 模型中的数据链路层和物理层相对应,负责管理网络硬件设备和物理媒介之间的通信。它包括以太网、Wi-Fi、蓝牙等各种物理层和数据链路层协议。