计算机网络
OSI七层协议和TCP/IP四层协议

http 1.0、1.1、2.0的区别
- 搞懂 HTTP 1.0 /1.1/2.0 协议差别
- http 1.0 中,一个 tcp 连接只做一件事情
- http 1.1 中,保持连接的机制,一个 tcp 连接多次重复使用
- http 2.0 中,多路复用,一个 tcp 连接并行发送多个请求和响应。数据流优先级和服务器推送。
地址栏输入 URL 发生了什么
- 前端经典面试题: 从输入URL到页面加载发生了什么
- 从输入网址到浏览器呈现页面内容,中间发生了什么
- 解析,例如http://www.baidu.com,其中http为协议,www.baidu.com为网络地址
- DNS解析,浏览器缓存、路由器缓存、DNS缓存,若没找到则请求上级DNS服务器,直至找到或到根节点。
- 请求,包括请求的方法(GET / POST)、目标url、遵循的协议(http / https),组成http请求。
- 传输层TCP传输报文,三次握手、四次挥手等
- 网络层IP协议查询MAC地址,ARP协议可以将IP地址解析成对应的MAC地址。当通信的双方不在同一个局域网时,需要多次中转才能到达最终的目标。
- 数据链路层,找到对方的MAC地址后,就将数据发送到数据链路层传输。
- 服务器负载均衡:硬件F5,软件lvs、反向代理nginx(epoll)转发算法:轮询、权重、ip_hash
- 应用服务器:处理请求、返回响应
TCP 如何保证可靠传输
- TCP/IP常见面试题
- TCP 协议 · 笔试面试知识整理
- TCP协议-如何保证传输可靠性
- 校验和:将首部、数据生成校验和,校对错误就丢弃。分为:IP校验和、TCP校验和、ICMP校验和。
- 序列号:发送的每一个包进行编号,接收方对数据包进行排序
- 确认应答:发送ACK报文确认应答
- 超时重传:TCP发出一个段后,它启动一个定时器,超时后重传
- 连接管理:三次握手与四次挥手
- 流量控制:当接收方来不及处理发送方的数据,能提示发送方降低发送的速率(滑动窗口协议)
- 拥塞控制:当网络拥塞时,通过动态改变窗口的大小,减少数据的发送。
- 慢开始,由小到大倍数增加窗口数值。适用于传输开始时和因超时而重新启用时
- 拥塞避免,窗口超过慢开始的阈值,就缓慢增加窗口大小
- 快重传,客户端收到失序的报文段,需要尽快发送对未收到的报文段的重复确认。
- 快恢复,快恢复就是收到三个重复的确认(可看作是网络已经拥塞了),此时并不执行慢开始算法,而是执行快恢复,就是新的门限值是原来的一半,直接进入拥塞避免阶段。
糊涂窗口综合症、delay ack 和 Nagle 算法
- TCP之Nagle算法&&延迟ACK
- 一不小心,陷入TCP的性能问题
- 糊涂窗口综合症:当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,可能导致有效载荷可能只有1个字节,而传输开销有40字节(20字节的IP头+20字节的TCP头)
- 客户端求解:delay ack,收到包后不急着发ACK,一是如果需要发包可以搭顺风车,二是合并多个ACK
- 服务端求解:Nagle算法['neɪgəl],发送数据包时,如果数据包小于MSS(最大分段大小),则会去判断是否有已发出去的包还没有ACK,如果有则不着急发送,等等前面的包收到ACK再发送
粘包、拆包
- TCP粘包问题分析和解决(全)
- 解析 http 协议是否要处理粘包?
- UDP报文,要么是一整个,要么不收,不存在粘包问题
- TCP是面向字节流的,2k,4k ,8k,这三个数据包,若接收的缓冲区大小在14k以上,就能一次性接收,所以需要拆包
- HTTP有三种方式处理拆包:
- http 1.0,一个请求一个响应,所以read complete就行
- Content-length
- transfer-encoding: chunked,用0、空行标志结束
为什么是四次挥手,客户端TIME_WAIT后还要等待2MSL?
- 两张动图-彻底明白TCP的三次握手与四次挥手
- A 和 B 通话结束时,A 说“我说完了”,B回答“我知道了”,但是 B 可能还有要说的话,最后 B 说“我说完了”,A 回答“知道了”
- 客户端发送ACK进入TIME_WAIT,防止服务端没有收到ACK而重发FIN+ACK报文,所以需要等待2MSL
TCP和UDP的区别
- 面试官问到TCP/IP怎么回答才过关
- TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接
- TCP保证可靠传输;UDP不保证可靠
- TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
- TCP连接是一对一;UDP支持一对一,一对多,多对一和多对多
- TCP首部开销20~60字节;UDP的首部开销只有8个字节
TCP keepalive
- TCP keepalive 详解
- 在连接闲置 tcp_keepalive_time 秒后,发送探测包,如果对方回应ACK,便认为依然在线;否则间隔 tcp_keepalive_intvl 秒后,持续发送探测包,一直到发送了 tcp_keepalive_probes 个探测包后,还未得到ACK回馈,便认为对方crash了。