#使用 Session 的过程是怎样的?
- 用户进行登录时,提交包含用户名和密码的表单,放入 HTTP 请求报文中;
- 服务器验证该用户名和密码,如果正确则把用户信息存储到本地中,生成一个 Session ID;
- 服务器返回的响应报文的 Set-Cookie 首部字段包含了这个 Session ID,客户端收到响应报文之后将该 Cookie 值存入浏览器中;
- 客户端之后对同一个服务器进行请求时会包含该 Cookie 值,服务器收到之后提取出 Session ID,从本地中取出用户信息,继续之前的业务操作。
#Session和cookie应该如何去选择(适用场景)?
- Cookie 只能存储 ASCII 码字符串,而 Session 则可以存储任何类型的数据,因此在考虑数据复杂性时首选 Session;
- 对于用户状态和敏感数据,应优先使用Session,因为数据存储在服务器端,更安全可靠。
- 对于用户偏好设置和非敏感数据,可以使用Cookie,便于在客户端存储和传递,减轻服务器压力。
- 需要注意的是,Session和Cookie可以结合使用,例如将Session ID存储在Cookie中,以便在客户端和服务器之间建立关联。
#DDos 攻击了解吗?
DDoS (Distributed Denial of Service) 攻击是一种恶意行为,旨在通过超过目标系统处理能力的大量请求或恶意流量来使目标系统无法正常运行。
DDos 预防:
流量分析和监测:实施流量分析和监测系统,以便及时检测和识别异常的网络流量模式。
防火墙和过滤器:配置防火墙和过滤器以过滤恶意流量并屏蔽来自已知攻击源的访问。
负载均衡:使用负载均衡设备将流量分散到多个服务器上,减轻单个服务器的负载压力。
反向代理:使用反向代理服务器来隐藏真实服务器的IP地址,使其更难受到直接的攻击。
限制连接和频率:防止单个IP地址或用户对系统进行过多的连接或请求
#MTU和MSS分别是什么?
MTU(Maximum Transmission Unit)是指数据链路层所能承载的最大数据包大小,以太网的MTU为1500字节。
MSS(Maximum Segment Size)表示在TCP传输数据的最大大小。是在建立TCP连接时通过协商确定的。MSS值为MTU值减去IPv4 Header(20 Byte)和TCP header(20 Byte)得到。
#MSL和TTL?
MSL(Maximum Segment Lifetime),它是任何报文在网络上存在的最长时间。
IP 头中有一个 TTL
字段,是 IP 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。
MSL 与 TTL 的区别: MSL 的单位是时间,而 TTL 是经过路由跳数。所以 MSL 应该要大于等于 TTL 消耗为 0 的时间,以确保报文已被自然消亡。
#HTTP中有个缓存机制,但如何保证缓存是最新的呢?
HTTP 缓存有两种实现方式,分别是强制缓存和协商缓存。
强制缓存:
- 当浏览器第一次请求访问服务器资源时,服务器会在 Response 头部加上 Cache-Control,表示资源过期时间;
- 浏览器再次请求访问服务器中的该资源时,会先比较请求时间与资源过期时间,如果没有过期,则直接使用该缓存,否则重新请求服务器;
- 服务器再次收到请求后,会再次更新 Response 头部的 Cache-Control。
使用 ETag 字段实现的协商缓存的过程:
- 当浏览器第一次请求访问服务器资源时,服务器在 Response 头部加上 ETag 唯一标识,这个唯一标识的值是根据当前请求的资源生成的;
- 当浏览器再次请求访问服务器中的该资源时,首先会先检查强制缓存是否过期:
- 如果没有过期,则直接使用本地缓存;
- 如果缓存过期了,会在 Request 头部加上 If-None-Match 字段,该字段的值就是 ETag;
- 服务器再次收到请求后,会根据请求中的 If-None-Match 值与当前请求的资源生成的唯一标识进行比较:
- 如果值相等,则返回 304 Not Modified,不会返回资源;
- 如果不相等,则返回 200 状态码和返回资源,并在 Response 头部加上新的 ETag 唯一标识;
- 如果浏览器收到 304 的请求响应状态码,则会从本地缓存中加载资源,否则更新资源。
#TCP头部中有哪些信息?
源端口号、目的端口号
序号(32bit):在建立连接时由计算机生成的随机数作为其初始值,每发送一次数据,就「累加」一次该「数据字节数」的大小。用于解决网络包乱序问题。
确认号(32bit):指下一次「期望」收到的数据的序列号,
发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。首部长(4bit):32位系统中一个字等于4个字节,首部长度的单位是字,首部长度字段有4位,所以TCP首部最长为 $2^4 -1 = 15(字) = 60(字节)$。
标志位(6bit):
URG:标志紧急指针是否有效。
ACK:标志确认号是否有效(确认报文段)。
PSH:提示接收端立即从缓冲读走数据。
RST:表示要求对方重新建立连接(复位报文段)。
SYN:表示请求建立一个连接(连接报文段)。
FIN:表示关闭连接(断开报文段)。
窗口(16bit):接收窗口。用于告知对方(发送方)本方的缓冲还能接收多少字节数据。用于解决流量控制。
校验和(16bit):接收端用CRC检验整个报文段的完整性。
#常见TCP的连接状态有哪些?
https://blog.csdn.net/chenxiyuehh/article/details/100146419
- CLOSED:初始关闭状态。
- LISTEN:服务器处于监听状态。
- SYN_SEND:客户端socket执行CONNECT连接,发送SYN包,进入此状态。
- SYN_RECV:服务端收到SYN包并发送服务端SYN包,进入此状态。
- ESTABLISH:表示连接建立。客户端发送了最后一个ACK包后进入此状态,服务端接收到ACK包后进入此状态。
- FIN_WAIT_1:终止连接的一方(通常是客户机)发送了FIN报文后进入。等待对方FIN。
- CLOSE_WAIT:(假设服务器)接收到客户机FIN包之后等待关闭的阶段,发送ACK包给客户机。
在接收到对方的FIN包之后,自然是需要立即回复ACK包的,表示已经知道断开请求。但是本方是否立即断开连接(发送FIN包)取决于是否还有数据需要发送给客户端,若有,则在发送FIN包之前均为此状态。 - FIN_WAIT_2:客户端接收到服务器的ACK包,但并没有立即接收到服务端的FIN包,进入FIN_WAIT_2状态。
- LAST_ACK:服务端发送最后的FIN包,进入此状态,等待最后的客户端ACK响应,进入CLOSE状态。
- TIME_WAIT:客户端收到服务端的FIN包,并立即发出ACK包做最后的确认,在此之后的2MSL时间称为TIME_WAIT状态,之后进入CLOSE状态。
#TCP是什么?
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
#OSI 的七层模型的主要功能?
- 物理层:负责传输比特流,处理物理介质和电信号。
- 数据链路层:提供可靠的点对点数据传输,处理帧和物理地址。
- 网络层:将数据包从源主机传输到目标主机,处理路由和寻址。
- 传输层:提供端到端的可靠数据传输,处理连接和流控制。
- 会话层:管理应用程序之间的会话。
- 表示层:处理数据的表示和格式转换,提供加密和压缩功能。
- 应用层:给用户提供网络应用服务,如HTTP、FTP等。
**物理层:**利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。 **数据链路层:**接收来自物理层的位流形式的数据,并封装成帧,传送到上一层 **网络层:**将网络地址翻译成对应的物理地址,并通过路由选择算法为分组通过通信子网选择最适当的路径。 **传输层:**在源端与目的端之间提供可靠的透明数据传输 **会话层:**负责在网络中的两节点之间建立、维持和终止通信 **表示层:**处理用户信息的表示问题,数据的编码,压缩和解压缩,数据的加密和解密 **应用层:**为用户的应用进程提供网络通信服务
#应用层常见协议知道多少?了解几个?
协议 | 名称 | 默认端口 | 底层协议 |
---|---|---|---|
HTTP | 超文本传输协议 | 80 | TCP |
HTTPS | 超文本传输安全协议 | 443 | TCP |
Telnet | Teletype远程登录服务的标准协议 | 23 | TCP |
FTP | 文件传输协议 | 20传输和21连接 | TCP |
TFTP | Trivial File简单文件传输协议 | 69 | UDP |
SMTP | 简单邮件传输协议(发送用) | 25 | TCP |
POP | 邮局协议(接收用) | 110 | TCP |
DNS | 域名解析服务 | 53 | 服务器间进行区域传输的时候用TCP 客户端查询DNS服务器时用 UDP |
#浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?
如果采取短连接,则在HTTP请求完成后断开。如果采取长连接,则会一直保持TCP连接。当遇到以下情况就会断开:
- 服务器或浏览器主动关闭连接。
- 连接超时或故障。
#三次握手相关内容
- 一开始,客户端和服务端都处于
CLOSE
状态。先是服务端主动监听某个端口,处于LISTEN
状态 - 客户端发送SYN包给服务器,其中
序列号
字段中填入随机初始化序号(ISN),把SYN
标志位置为1
。客户端处于SYN-SENT
状态。 - 服务端收到客户端的
SYN
报文后,服务端发送SYN+ACK包给客户端。其中序列号
字段中填入随机初始化序号,其次把确认应答号
字段填入客户端序列号+1,接着把SYN
和ACK
标志位置为1
。服务端处于SYN-RCVD
状态。 - 客户端收到服务端报文后,发送ACK包给服务器将,其中序列号为客户端序列号+1 ,其次
确认应答号
字段填入 服务端序列号+1 ,ACK
标志位置为1
。这次报文可以携带客户到服务端的数据,之后客户端处于ESTABLISHED
状态。 - 服务端收到客户端的应答报文后,也进入
ESTABLISHED
状态。
#为什么需要三次握手,两次不行吗?
通过这个三次握手的过程,双方确保了彼此的接受和发送能力和彼此的初始序列号的确认。这种双向确认可以防止已失效的连接请求被错误地接受,确保了连接建立的可靠性,避免了资源浪费。
#什么是半连接队列?
服务器第一次收到客户端的 SYN 之后,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在半连接队列。
扩展: 当然还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。
这里在补充一点关于SYN-ACK 重传次数的问题: 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传。如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。 注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s,2s,4s,8s......
#ISN(Initial Sequence Number)是固定的吗?
初始化序列号 ISN 由 M + F(localhost, localport, remotehost, remoteport)生成。
M
是一个计时器,这个计时器每隔 4 微秒加 1。F
是一个 Hash 算法,根据源 IP、目的 IP、源端口、目的端口生成一个随机数值。
用于防止已失效的连接请求被错误地接受,以及被攻击者得到初始序列号。
#三次握手过程中可以携带数据吗?
其实第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手不可以携带数据
也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据。
#SYN攻击是什么?
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是客户端在短时间内伪造大量不存在的IP地址,并向服务器不断地发送SYN包,而服务器将其不断放入半连接队列,直至填满也无法得到客户端ACK响应导致正常请求丢包,从而引起网络拥塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击。
检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。在 Linux/Unix 上可以使用系统自带的 netstat 命令来检测 SYN 攻击。
netstat -n -p TCP | grep SYN_RECV
常见的防御 SYN 攻击的方法有如下几种:
- 缩短超时(SYN Timeout)时间
- 过滤网关防护
- SYN cookies技术