计网常见八股:
- dns(53端口)(udp)解析过程?
- 查询浏览器缓存
- 查询本地host文件缓存
- 向本地域名解析服务器查询,本地DNS服务器查询自己的高速缓存
- 根域名服务器—->顶级域名服务器——>权威域名服务器
- 浏览器保存缓存结果
- 迭代查询和递归查询
- 客户机与服务器之间的查询时递归查询
- 服务器之间的查询是迭代查询
- 输入url—->发生什么?
- 域名解析:url——>ip(DNS域名解析)
- 三次握手并发送HTTP请求(HTTP//TCP)
- 报文在网络中传输会涉及ip协议,arp协议等…
- 服务端响应报文
- 客户端收到对应的报文然后解析并渲染
- 根据是否为长连接决定是否关闭tcp连接
- arp协议属于哪一层?
- 网络层
- dns(Domain Name System)劫持?
- 域名到ip的过程中,通过将原域名对应的Ip地址替换从而使得用户访问到错误的网站的一种攻击方式
- http请求报文的形式?
- 请求行、请求头部、请求体
- 握手失败
- 第一次握手失败
- 客户端重传
- 第二次握手失败
- 服务端会重传、客户端也会重传
- 第三次握手失败
- 服务端会定时重新发送SYN+ACK,默认是5次,重传次数到了之后,仍然没有收到ACK应答,server会自动关闭这个连接
- 第一次握手失败
- get && post 的区别
- get有长度显示,主要是浏览器限制、信息存放在URL中,浏览器能直接缓存相对于post没有那么安全
- post消息存放在http报文的请求体中,由于放在报文中,对长度没有限制
- get具有幂等性以及安全性
- TCP拥塞控制
- 慢启动:【发送方每收到一个ack,拥塞窗口+1,所谓发包的个数呈指数增长】
- 拥塞控制:【达到慢启动门限时,每收到一个ack,拥塞窗口+1/拥塞窗口】
- 拥塞发生:
- 超时重传:慢启动门限都变为当前拥塞窗口的一半,拥塞窗口变为1(初始值)
- 快速重传:慢启动门限都变为当前拥塞窗口的一半,拥塞窗口也变为一半,进入拥塞控制流程
- 快恢复:【】
- TCP报文的结构
- tcp报文首部为20个字节,源端口以及目的端口,序号+确认号,后面的不太记得….校验和以及滑动窗口,紧急指针,标志位等….
- 一共有5行,一行是4个字节
- 窗口+校验和+紧急指针
- HTTP状态码从1到5是什么意思
- 301:表示永久重定向
- 302:表示临时重定向
- 403:服务器禁止访问此资源
- 404:服务器访问的资源不存在
- 503:服务器当前很忙:暂时无法响应客户端
- 流量控制引发的死锁
- 发送方窗口大小为0,使得发送方不能再发送数据,一会之后接收方有了一些缓存,重新调整接收窗口并通知A,但是消息丢失,A在等待继续发送报文的通知,B在等待A的数据,就变成了死锁
- 为每个连接设置一个持续计时器,只要一方接收到0窗口通知,就启用持续计时器,会发送0窗口探测报文
- TCP和UDP的区别
- 面向连接的、可靠的、字节流的数据传输协议,基于ip协议,为了实现可靠传输,采用了三次握手、累计确认、超时重传、流量控制、拥塞控制、四次挥手这些机制来实现数据的可靠传输
- udp是无连接的数据报传输协议
- Tcp的发送窗口
- TCP发送方的发送窗口 = min(自身拥塞窗口、TCP接收方的接收窗口)
- TCP和UDP的应用场景
- 稳定的数据传输
- 报文、视频通话等
- dsn查询就是基于udp协议
- HTTP和HTTPS的区别
- HTTP端口为80、HTTPS端口为443
- HTTP信息是明文传输,存在安全风险的问题,在HTTP与网路层之间加入了SSL/TLS安全协议
- HTTP协议需要向CA申请数字证书
- HTTPS产生性能消耗的两个环节
- TLS协议的握手环节
- 握手后的对称加密消耗
- HTTPS的加密解密过程
- 核心:客户端生成随机数使用公钥加密,然后使用服务端使用过私钥解密
- 为什么需要TIME_WAIT状态
- 防止原来的报文对新连接产生干扰,为什么会产生干扰
- 最后一次回复的ack丢失,需要重传几次…
- 计算机网络的TCP/IP模型
- 应用层、传输层、网络层、数据链路层、物理层
- TCP四次挥手的过程
- fin_wait1
- fin_wait2
- close_wait
- last_ack
- closed
- TCP有请求阻塞么 1.
- ICMP
- ping && tracert
- 为什么需要三次握手,二次握手为什么不行?
- 三次握手才可以阻止重复历史连接的初始化(主要原因)
- 三次握手才可以同步双方的初始序列号
- Ipv4包含什么(IP协议包含什么)
- HTTP有哪些header?
- HTTP报文格式:请求行、请求头部、请求包体
- 请求行:方法字段 + URL字段 + HTTP协议版本
- 请求头部:请求头部由关键字/值对组成
- 请求体:请求体不在GET方法中使用、而是在POST方法中使用
- HTTP状态码
- 1xx :提示信息(表示目前是协议处理的中间状态、还需要后续操作)
- 200:请求成功
- 301:永久重定向:永久换地方:服务器定义,请求的资源不存在了,需要改用新的URL再次访问
- 302:临时重定向:临时换地方:服务器定义,表示请求的资源还在,暂时需要另一个·URL来访问
- 400:不能解析报文
- 403:服务器拒绝请求
- 404:服务器无法根据客户端的请求找到资源
- 500:服务器内部错误
- 301和302之间有什么区别?
- 301:永久移动,请求的资源已被永久的移动到新的URI,旧的地址已经被永久的删除了,返回信息会包括新的URI,浏览器会自动到新的URI,以后新的请求都应使用新的URI替代
- RTT
- 指的是一个短分组从客户端到服务端再返回客户端所花费的时间
- HTTP请求协议版本号放在哪里
- 请求行
- Keep-Alive 和非 Keep-Alive区别
- Http1.1版本协议中默认使用持久连接、Http1.0版本需要在请求头部添加Connection:Keep-Alive
- TCP keep-alive 是判断是否在线,如果判断对方不在线,则关闭这个连接
- HTTP中的alive表示的是维持的是一个长连接
- 什么使用使用非Keep-Alive
- 大部分情况下使用非Keep-Alive,Web网站用户比较多
- Http的发展历史
- http0.9:每次连接都需要重新握手等…
- http1.0:支持持久连接,在请求头部添加Connection:Keep-Alive
- http1.1:持久连接成为默认的连接方式
- http2.0:
- Http2 采用二进制格式传输数据而不是文本格式传输数据
- 服务端推送数据到客户端缓存中,加快响应
- 多路复用
- http3.0
- 使用了基于UDP协议的quic协议
- TCP如何保证可靠传输
- 三次握手
- 校验和
- 累计确认
- 流量控制
- 拥塞控制
- 四次挥手
- 滑动窗口的设置和结构
- 滑动窗口是为了匹配接收端和发送方的接收速率
- 可以顺便提到零窗口检测
- listen函数第二个参数的含义,我设置成多少、什么时候会用到这第二个参数、 如何第二个参数量满了会发生什么
- 拒绝connect,同时返回
- 数字签名、数字证书
- 套接字:
- 进程通过一个称为套接字的软件接口向网络发送报文和从网络接收报文,套接字是应用层和运输层之间的接口
- 进程寻址:【目的主机IP地址+端口号】
- ip+port即可寻址
- socket套接字类型:
- 数据流套接字(SOCK_STREAM):无差错、无重复传送、并按顺序接收
- 数据报套接字(SOCK_DGRAM):
- 原始套接字
- 交换机&&路由器
- 路由器属于网络层设备,实现了不同网络之间的的数据转达
- 交换机属于数据链路层设备,实现了特定网络内的数据交换
- HTTP服务器可以主动给客户端发送数据吗?
- 轮询:
- 客户端定时请求
- 长轮询:
- 维护一个连接,有新消息就返回给客户端,客户端收到并处理完之后才重新请求连接
- 长连接:
- 一直推送即可
- 轮询:
- ARP 和· RARP是网络层协议
- ip——>mac:ip地址映射到mac地址
- max—->ip:mac地址映射到ip地址
- 两次握手为什么不行?
- 防止旧的连接初始化造成混乱
- 同步双方的初始序列号
- memcpy和memmove
- xx
- 四大转换cast【怎么能够扯到2分钟?】
- dynamic_cast
- static_cast
- repreint_cast
- const_cast
- 虚函数的存储的内容 && 如何寻找虚函数表 1.
- 虚函数表存储的位置?
- 存储在只读数据区域!!!
- 归并排序和快排的一个时间复杂度?空间复杂度?
- 最坏时间复杂度
- 写一个快排 && 归并排序
- 操作系统的内存管理??
- const有哪些用处
- const通常需要初始化
- const可以修饰形参
- const可以放在函数名后面表示常函数,不能修改类里面的成员
- const修饰返回值,以使得其返回值不为“左值”。
- 介绍一下MVC框架
- 平常做项目的时候是怎么debug的
- 单元模块测试
- 断点调试>>查看函数调用过程
- 讲一下智能指针,weak和shared使用时有什么区别,什么时候用shared,什么时候用weak
- 虚表是哪时候生成的(编译时)
- 编译期间
- 在tcp四次挥手中,如果服务器出现宕机或者断网,当服务器重启和重新联网,这个挥手还会继续吗?
- lambda的底层实现
- 既然懂多线程,那你一定很了解c++里的future和promise吧(我吐血,还真不了解,这个问题也是没见过)
- 宏 && const 是在哪个阶段进行
- 宏是在预处理阶段
- const是在编译阶段
- 类A有虚函数,类B继承类A,然后实例化10次类B,内存中有多少个虚函数表
- time_wait是主动断连方的还是被动断连方的,存在的原因是什么,哪些应用场景要调小time_wait的时间长度 1.
- 20亿个整数,有一个数出现了2次,找到这个重复的数字,计算所需内存大小
- TCP协议下,一个包200字节,发送10个这样的包,接收端调用read函数,实际read函数返回的包长度有哪些?
- C++的派生类指针强制转换成基类指针,指针的内容会发生变化么?
- 对象切片
- 类A继承类B和类C,类A、类B、类C均有一个虚函数和一个成员变量,实例化一个类A,说下对象A的内存结构
- 假如cpu占用过多,如何排查哪一段代码出现了问题?
- 如何查看当前运行进程? 1.
- C++动态库和静态库
- .C++ 深拷贝和浅拷贝
- 多态有多少种实现方法(没答全)
- 线程池、有限状态机(缺点)
- 如何查询服务器瓶颈、tcpdump抓包、gdb调试
- epoll中LT和ET的区别,使用场景,你的项目用哪个最好
- 服务器的瓶颈如何查询、并如何进行优化
- xx
- 结构体字节对齐,如何自定义对齐
- 讲讲套接字编程流程,哪几个方法,套接字设置选项
- Linux进程中空间如何分配
- 一个类对象如何进行存储
- STL map的底层实现(红黑树底层不会,没有深入)
- 一致性哈希算法,哈希失效了怎么办,服务器查询不了了
- sizeof、strlen区别
- sizeof是一个操作符
- strlen表示计算长度…,是一个库函数
- 顺便提一句:在写webserver里面碰到过这个问题
- 构造函数的顺序和析构函数的顺序,原因?
- 悲观锁和乐观锁(加场景)
- https握手第一次发送的消息有什么(是什么包)
- TCP的队头阻塞
- 32位的编译器在64位的机器上运行上述情况会有什么区别
- 动态链接时候,怎么去找到要调用的库,是怎么处理的,如何与这个可执行的二进制文件结合到一起。(不会)
- 说一下对线程了解的东西(扯了一下为什么要有线程,线程和进程的区别和关联)
- 怎么实现多线程访问临界区
- 磁盘里的数据易丢失,或者磁盘写错了,或者磁盘坏掉了,操作系统是怎么处理应对的(不会)
- 介绍了虚拟内存的概念,局部性原理,快表,多级页表,如何从逻辑地址找物理地址
- 进程的内存空间分部
- 零拷贝相关
- C字符串没有len标记, free字符串的时候怎么知道free多少呢?
- 交换两个数的多种方法,中间变量,加减,位运算…
- 详细讲解C++11新特性
- 中断与异常,多进程是如何工作的
- linux如何设置后台进程,后台进程和守护进程的区别
- 给定类,判断大小,包括空类,加入static,加入虚函数,考虑到内存对齐
- C++内存布局空间
- linux查看进程状态
- linux查看进程打开的文件
- 常见的排序算法有哪些,为什么最低时间复杂度是O(nlogn),我以快速排序和归并排序的角度讲了详细的算法复杂度推导
- 如果归并排序由1/2改为1/4和3/4,复杂度会怎么变化
- 线程池里面的线程数量怎么设置?
