2024.11.02 周六
上午睡觉,下午练车,晚上回家吃饭又睡了一会。
八股
键入网址到网页显示,期间发生了什么?
- 浏览器做的第一步工作是解析URL,并根据确定的Web服务器和文件名生成HTTP请求消息。
- 查询服务器域名对应IP地址(DNS解析)。
- 将HTTP的传输工作交给操作系统中的协议栈。
- 应用程序(浏览器)通过调用Socket库,来委托操作系统中的协议栈工作。
- 协议栈上半部分是TCP和UDP协议,它们接受应用层(浏览器)的委托执行收发数据的操作。
- 协议栈下半部分是IP协议控制网络包的收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由IP负责的。
- IP中包括ICMP(告知网络包传送过程中产生的错误)和ARP(根据IP地址查询相应的以太网MAC地址)。
- 网卡驱动程序获取网络包之后,将其复制到网卡内的缓存区,在开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列,最后网卡将包转成电信号,通过网线发送出去。
- 网络包只是存放在内存中的一串二进制数字信息,因此需要将数字信息转换成电信号,才能在网线上传输。
- 电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换成数字信号,根据MAC地址表查找MAC地址,将信号发送到相应的端口。
- 交换机的端口不具有MAC地址
- 当交换机无法判断应该把包转发到哪个端口 或 接收方MAC地址是一个广播地址(FF:FF:FF:FF:FF:FF),交换机会将包发送到除源端口之外的所有端口。
- 网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备,当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发送出去。
- 路由器的各个端口都具有MAC地址和IP地址
- 在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。
- MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃。
算法
200.岛屿数量 (深度优先搜索dfs)
215.数组中的第k个最大元素(暴力解法:快速排序)
快速排序
通过筛选一个基准元素,将待排序列分隔成两个子序列,使其中一个子序列元素都小于基准元素,另一个子序列元素都大于基准元素,再对子序列进行快速排序直到整个序列有序。
//暂时没彻底搞懂快速排序,明天继续解决
class Solution {
public int quickselect(int[] nums, int l, int r, int k) {
//若left = right,即数组长度n=1时,返回索引为n-k的数即数组中倒数第k个值
if (l == r) return nums[k];
//将第一个元素作为基准元素开始快速排序
int x = nums[l], i = l - 1, j = r + 1;
//该循环结束后,左右指针停止移动,此时除第一个元素外,停止点左侧都小于基准元素,停止点右侧都大于基准元素
while (i < j) {
//do-while后i所指位置元素为左侧第1个大于基准元素的数,j为右侧第1个小于基准元素的数
do i++; while (nums[i] < x); //当左侧指针所指元素小于基准元素,左指针右移
do j--; while (nums[j] > x); //当右侧指针所指元素大于基准元素,右指针左移
//当i<j时,将索引i,j的位置互换
if (i < j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
if (k <= j) return quickselect(nums, l, j, k);
else return quickselect(nums, j+1, r, k);
}
项目
JavaWeb刚看完,大致能完成MVC的SpringWeb开发流程。
2671

被折叠的 条评论
为什么被折叠?



