以图镇压 (引用极客时间)
1、DNS域名解析
- CDN
- Context Delivery Network 表示内容分发网络 ,很多大型望着那,都会引入CDN来加速静态内容的访问。
- CDN就是一种网络缓存技术,能够把一些相对"稳定"的资源放到距离最终用户较近的地方,一般会把一些静态文件(图片、脚本、静态页面)放入到CDN中。
- 优点:解决广域网的带宽的消耗;提升用户的访问速度
2、HTTP协议通讯
应用层的协议,除了HTTP还有FTP/DNS/SMTP/Telnet等
- HTTP头
-
HTTP正文
常见的
-
状态码说明
状态码 类型 原因短语 1XX Informational(信息性状态码) 接受的请求正在处理 2XX Success(成功状态码) 请求正常处理完毕 3XX Redirection(重定向状态码) 需要进行附加操作以完成求情 4XX Client Error(可以短错误状态码) 服务器无法处理请求 5XX Server Error(服务器错误状态码) 服务器处理请求出错
3、TCP/UDP
- 三次握手
-
第 一 次 握 手 (SYN=1, seq=x) 客户端发送一个 TCP 的 SYN 标志 位置1的包,指明客 户端打算连接的服 务器的端口,以及 初始序号 X , 保存 在包头的序列号 (Sequence Number) 字段里 。 发送完毕后,客户 端 进 入 SYN_SEND 状态。
-
第 二 次 握 手
(SYN=1, ACK=1, seq=y, ACKnum=x+1): 服务器发回确认包 (ACK) 应 答 。 即 SYN 标志位和
ACK 标志位均为 1。服务器端选择自 己 ISN 序列号,放 到Seq 域里,同时 将 确 认 序 号 (Acknowledgeme nt Number)设置为 客户的 ISN 加 1, 即X+1。 发送完毕后,服务 器 端 进 入 SYN_RCVD 状态。 -
第 三 次 握 手 (ACK=1 , ACKnum=y+1) 客户端再次发送确 认包(ACK),SYN标 志位为 0,ACK 标 志位为1,并且把服 务器发来 ACK 的 序号字段+1,放在 确定字段中发送给 对方,并且在数据 段放写 ISN 发完毕 后,客户端进入 ESTABLISHED 状 态,当服务器端接
收到这个包时,也 进入
ESTABLISHED 状 态,TCP握手结束。 -
四次挥手
- 第一次挥手(FIN=1,seq=x) 假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据 可以发送了,但是仍然可以接受数据。发送完毕后,客户端进入 FIN_WAIT_1 状态。
- 第二次挥手(ACK=1,ACKnum=x+1) 服务器端确认客户端的 FIN包,发送一个确认包,表明自己接受到了客户端关闭连接的请求, 但还没有准备好关闭连接。发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这 个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。
- 第三次挥手(FIN=1,seq=w) 服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN置为1。发送完毕后,服务器 端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。
- 第四次挥手(ACK=1,ACKnum=w+1) 客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT 状态,等待 可能出现的要求重传的 ACK包。
- 服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。
- 客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime) 之后,没有收到服务器端的 ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接, 进入 CLOSED状态。(2MSL具体的时间不固定。这个有了解的伙伴可以说说)
4、分层模型
-
三种:OSI七层、TCP五层、TCP/IP四层
-
分层协议
5、分层负载
负载都是对服务端的负载,从外到内,也就是物理层到应用层
-
二层负载
通过一个虚拟MAC地址接收请求,然后再分配到真实的MAC地址
针对MAC,负载均衡服务器对外依然提供一个VIP(虚IP),集群中不同的机器采用相同的IP地址,但是机器的MAC地址不一样。当负载均衡服务器接收到请求之后,通过改写报文的目标MAC地址的方式转发到目标机器实现负载均衡
-
三层负载
通过一个虚拟IP地址接收请求,然后再分配到真实的IP地址
针对IP,和二层负载类似,负载均衡服务器对外依然提供一个VIP(虚ip),但是集群中不同的机器采用的不同的IP地址。当负载均衡服务器接收到请求之后,根据不同的负载均衡算法,通过IP讲请求转发至不同的真实服务器
-
四层负载
通过虚拟IP + 端口 接收请求,然后再分配到真实的服务器
工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源目标IP、目标IP以外,还包含源端口号及目标端口号。四层负载均衡服务器在接收到客户端请求以后,通过修改数据包的地址信息(ip+端口)讲流量转发到应用服务器
-
七层负载
通过虚拟的URL或主机名接收请求,然后再分配到真实的服务器
工作中OSI模型的应用层,应用层协议较多,常用的http、radius、dns等。七层负载就是基于这些协议来负载,这些应用层协议中会包含很多有意义的内容。比如同一个WEB服务器的负载均衡,除了根据IP加端口进行负载外,还可以根据七层的URL、浏览器类别来决定是否进行负载均衡。
6、Socket 通信过原理
Socket接口是TCP/IP网络的API(Application Programming Interface,应用程序编程接口),Socket接口定义了许多函数或例程,程序员可以用它们来开发 TCP/IP网络上的应用程序
手动使用JavaApi实现Socket聊天通讯
- 服务端
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
//初次被动等待客户端请求
System.out.println("client:" + in.readLine());
String buf = sin.readLine();
while (!"bye".equals(buf)) {
out.println(buf);
System.out.println("client:" + in.readLine());
buf = sin.readLine();
}
sin.close();
in.close();
out.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 客户端
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8080);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
String buf = sin.readLine();
while (!"bye".equals(buf)) {
out.println(buf);
System.out.println("server:" + in.readLine());
buf = sin.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}