网络协议
1、TCP状态 (SYN, FIN, ACK, PSH, RST, URG)
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议
TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包
在TCP层,有个FLAGS字段 (FLAGS意思为标识),这个字段有以下几个标识
- SYN, FIN, ACK, PSH, RST, URG
- SYN表示建立连接 (SYN:同步序列编号(Synchronize Sequence Numbers))
- FIN表示关闭连接,
- ACK表示响应, (ACK (Acknowledge character)即是确认字符)
- PSH表示有 DATA数据传输
- RST表示连接重置。
2、TCP连接的建立与终止
参考:https://zhuanlan.zhihu.com/p/86426969
2.1 三次握手
TCP的三次握手是为了建立可靠的连接而设计的。在建立连接之前,双方需要经过三次握手来确认连接的可行性
三次握手的过程如下:
-
第一次握手: 客户端向服务端发送SYN标识的数据包,表示要建立连接
-
第二次握手: 服务端收到客户端SYN数据包之后,通过ACK确认标识来进行回复确认,发送SYN和ACK标识数据给客户端,表示服务端同意建立连接
-
第三次握手: 客户端受到服务端的数据包之后,会发送一个ACK标识给服务器,表示已经收到服务器标识序号了,服务端收到报文后没问题之后,同意建立连接
第三次握手为什么要发送ACK标识给服务器?
- 为了证明客户端发送数据正常
- 表示已经收到服务器标识序号了
补充:
SYN(Synchronize)标志是用来同步序号的。它表示发送方希望建立连接,或者表示已经收到了对方的序号
ACK(Acknowledgment)标志是用来确认序号的。它表示已经收到了对方的序号,或者表示已经处理完了对方的数据。
2.2 四次挥手
四次挥手的过程如下:
-
第一次挥手:客户端发送一个带有 FIN 标志的数据包给服务器,表示客户端希望断开连接。
-
第二次挥手: 服务器收到客户端的数据包后,会发送一个带有 ACK 标志的数据包给客户端。表示服务器已经收到了客户端的请求,并且准备好断开连接。
- 此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
-
第三次挥手:服务器传输完数据之后,服务器发送一个带有 FIN 标志的数据包给客户端,表示服务器希望断开连接。
-
第四次挥手: 客户端收到服务器的数据包后,会发送一个带有 ACK 标志的数据包给服务器。表示客户端已经收到了服务器的请求,并且准备好断开连接。
补充:
1、FIN(Finish)标志是用来结束连接的。它表示希望断开连接
2、四次握手就是中间多了一层:等待服务器传输数据, 传输完成之后再一次响应回复相关数据的过程
2.3为什么建立连接是三次握手,而断开连接是四次挥手呢
简单来说:(因为二次挥手的时候当服务端收到客户端FIN报文时,需要先向客户端发送ACK码进行回复确认,但是此时的服务端并不会关闭socket【Socket是基于TCP】的连接),而是处于等待关闭的状态,因为服务端还有数据没有发送完毕,当服务端发送数据完毕之后,再向客户端发送FIN报文
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
- 答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
2.4 为什么连接的时候是三次握手?
2.5 什么是半连接队列?
2.6 三次握手过程中可以携带数据吗?
答:第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。
我们可以思考一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据,疯狂着重复发 SYN 报文,这会让服务器花费大量的内存空间来缓存这些报文,这样服务器就更容易被攻击了。
对于第三次握手,此时客户端已经处于连接状态,他已经知道服务器的接收、发送能力是正常的了,所以可以携带数据是情理之中。
2.8 如果第三次握手丢失了,客户端服务端会如何处理?
如果第三次握手丢失了,客户端会重新发送第三次握手。服务器收到重新发送的第三次握手后,会再次尝试建立连接。如果连接建立成功,就可以开始传输数据了。如果连接仍然无法建立,则连接就会断开,客户端和服务器会重新回到连接前的状态。
- TCP是有自动重连机制
3、输入url。按下回车键后发生了什么
1、首先输入地址 2、通过这个地址进行DNS解析成ip 3、把ip地址建立TCP连接,向服务器发送HTTP请求 【保证数据通信的完整性】 4、服务器发送永久重定向给浏览器响应 【即使网址更换域名, 通过301永久重定向将旧域名重定向至新域名,挽回流量损失和SEO,优化了SEO】 5、服务器处理请求 6、服务器返回HTTP响应 7、浏览器解析渲染页面 【浏览器渲染机制】 (构建dom树 -> 构建渲染render树 -> 布局render树 -> 绘制render树) 8、连接结束
1、URL 解析
1、首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。
2、HSTS (HTTP严格传输安全协议)
- 由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面
3、其他操作
- 浏览器还会进行一些额外的操作,比如安全检查、访问限制
4、检查缓存
- 如果缓存中有,会直接在屏幕中显示页面内容
2、DNS解析
1、解析获取相应的IP地址
3、TCP 连接
浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手
4、服务器处理请求
服务器处理请求并返回 HTTP 报文,将数据返回至浏览器
5、浏览器接受响应
浏览器接收到来自服务器的响应资源后,会对资源进行分析。
- 浏览器解码响应,如果响应可以缓存,则存入缓存
六、渲染页面
1、首先,在浏览器地址栏中输入url,先解析url,检测url地址是否合法 2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。 浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求; 操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近的DNS查询缓存); 路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存; ISP缓存:若上述均失败,继续向ISP搜索。 3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。 4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。 5、握手成功后,浏览器向服务器发送http请求,请求数据包。 6、服务器处理收到的请求,将数据返回至浏览器 7、浏览器收到HTTP响应 8、浏览器解码响应,如果响应可以缓存,则存入缓存。 9、 浏览器发送请求获取嵌入在HTML中的资源(html,css,javascript,图片,音乐······),对于未知类型,会弹出对话框。 10、 浏览器发送异步请求。 11、页面全部渲染结束
4、TCP和UDP的区别
UDP:
- 用户数据报文协议(UDP,User Datagram Protocol)
- UDP 是⼀个面向报文(报文可以理解为⼀段段的数据)的协议。意思就是UDP 只是报⽂的搬运工,不会对报文进行任何拆分和拼接操作
具体来说:
- 在发送端,应⽤层将数据传递给传输层的 UDP 协议, UDP 只会给数据增加⼀个 UDP 头标识下是 UDP 协议,然后就传递给⽹络层了 在接收端,⽹络层将数据传递给传输层, UDP 只去除 IP 报⽂头就传递给应⽤层,不会 任何拼接操作
TCP:
- TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议
- TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包
区别:
连接性:
- UDP 是⽆连接的,也就是说通信不需要建⽴和断开连接。
- UDP只提供端到端的数据传递,不做可靠性校验,因此不需要连接去确认
- 因此UDP的缺点不可靠,不稳定。
- TCP是面向连接,也就是说客户和服务器交换数据前,必须现在双方之间建立一个TCP连接,之后才能传输数据
- TCP协议需要保证数据传输可靠,那么我们通过连接(三次握手)这个过程确定,双方都可以收发数据。如果连接都连接不上,那么就可以确定双方的通信不可达,建立连接失败,没办法可靠的传输。
可靠性:
- TCP是可靠,UDP不可靠
报文:
- TCP面向字节流,UDP面向报文
效率:
- TCP传输效率低,UDP传输效率高
- 因为UDP支持一对一,一对多,多对一和多对多交互通信,而TCP连接只能一对一通信
- .TCP为了可靠性保证,增加了3次握手4次挥手,复杂的拥塞控制,以及流量控制,让网络传输的延迟进一步增加。
- TCP头部的大小比UDP复杂,也会影响传输的数据量
场景
-
UDP 应用场景:
- 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用 UDP。
- 语音、视频
- 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用 UDP。
-
TCP的应用场景:
- 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方
- 文件传输、浏览器的HTTP协议
- 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方
5、WebSocket 使用的是 TCP 还是 UDP 协议
- websSocket是基于TCP的协议的,不可能是UDP协议,UDP 是⽆连接的,也就是UDP说通信不需要建立和断开连接。而webSocket是客户端和服务器之间的连接
6、为什么说TCP是字节流协议
TCP是面向字节流的协议,意味着它把数据看成一个字节流
- 【为了方便传输】TCP会把数据划分成若干个数据包,并将这些数据包逐一发送出去。数据包的大小是不固定的
- 接收方在接收数据时把所有接收到的数据包组装起来,然后提供给应用层
- 应用层协议是在应用程序之间进行通信所使用的协议
当你在浏览网页时,你的电脑【客户端】就是接收方,它会接收到服务器发送的数据;而服务器则是发送方,它会向你的电脑【客户端】发送数据。当你的客户端收到数据后,它会将数据交给浏览器,由浏览器负责渲染网页。这里的浏览器就是应用层。
7、SYN攻击是什么?
SYN攻击(也称为三次握手攻击)是一种利用TCP协议漏洞的攻击方式。
- 在SYN攻击中,攻击者伪造自己的IP地址,向目标服务器发送大量的SYN报文段。目标服务器收到这些SYN报文段后,会进行第二次握手,并向攻击者发送SYN和ACK报文段。但是,由于攻击者的IP地址是伪造的,攻击者并不能收到这些报文段。这会导致目标服务器不断地等待攻击者的响应,从而使服务器资源耗尽,无法对其他请求作出响应。这就是SYN攻击的原理。
- SYN攻击利用TCP协议漏洞的攻击方式,可以造成服务器资源耗尽,无法对其他请求作出响应的后果。
如何防范SYN攻击?
-
可以使用SYN Cookies技术。SYN Cookies技术可以在不使用服务器状态的情况下,处理客户端的SYN请求。这样,服务器就不会因为大量的SYN请求而资源耗尽,从而防止了SYN攻击。
-
可以使用防火墙来防范SYN攻击。防火墙可以检测到大量的SYN请求,并根据设定的规则来进行过滤。例如,可以设定规则,拒绝来自某个特定IP地址的所有SYN请求。这样,就可以有效地防止SYN攻击了。
8、WebSocket协议是在哪一层?
- WebSocket协议位于应用层