一道经典的面试题
问:在浏览器输入网址到看到页面经历了哪些过程?
每个人有每个人的回答,先说下我对这道题的答案:
- 浏览器会访问DNS服务器将输入的域名对应的IP获取到
- 浏览通过HTTP协议和IP协议处理发送的建立连接的请求然后发送到互联网
- 在互联网中路由器根据目标IP地址,通过复杂的算法找出'最优路径'来传输请求
- 找到目标IP计算机(服务器)的网卡通过三次握手建立连接
- 服务器对请求进行分析处理然后返回浏览器需要的页面
- 浏览器拿到数据会对DOM结构和CSS进行分析形成renderTree然后渲染到页面上
- 在渲染的过程中有需要从服务器请求的资源,会重复1-6的过程
计算机网络的分层模型
OSI七层模型
- 应用层(Application) 提供网络与用户应用软件之间的接口服务
- 会话层(Session) 提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制
- 表示层(Presentation) 提供格式化的表示和转换数据服务,如加密和压缩
- 传输层(Transimission) 提供建立、维护和取消传输连接功能,负责可靠地传输数据(PC)
- 网络层(Network) 处理网络间路由,确保数据及时传送(路由器)
- 数据链路层(DataLink) 负责无错传输数据,确认帧、发错重传等(交换机)
- 物理层(Physics) 提供机械、电气、功能和过程特性(网卡、网线、双绞线、同轴电缆、中继器)
HttpServletRequest获取ip地址和mac地址
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
/**
* 常用获取客户端信息的工具
*/
public class NetworkUtil {
/**
* 获取ip地址
*/
public static String getIpAddress(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 本机访问
if ("localhost".equalsIgnoreCase(ip) || "127.0.0.1".equalsIgnoreCase(ip) || "0:0:0:0:0:0:0:1".equalsIgnoreCase(ip)){
// 根据网卡取本机配置的IP
InetAddress inet;
try {
inet = InetAddress.getLocalHost();
ip = inet.getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (null != ip && ip.length() > 15) {
if (ip.indexOf(",") > 15) {
ip = ip.substring(0, ip.indexOf(","));
}
}
return ip;
}
/**
* 获取mac地址
*/
public static String getMacAddress() throws Exception {
// 取mac地址
byte[] macAddressBytes = NetworkInterface.getByInetAddress(InetAddress.getLocalHost()).getHardwareAddress();
// 下面代码是把mac地址拼装成String
StringBuilder sb = new StringBuilder();
for (int i = 0; i < macAddressBytes.length; i++) {
if (i != 0) {
sb.append("-");
}
// mac[i] & 0xFF 是为了把byte转化为正整数
String s = Integer.toHexString(macAddressBytes[i] & 0xFF);
sb.append(s.length() == 1 ? 0 + s : s);
}
return sb.toString().trim().toUpperCase();
}
}
参考:blog.youkuaiyun.com/weixin_33894992/article/details/88018525