网络
HTTP协议
请求/响应报文
GET和POST方式的区别
- 参数的区别
- GET长度限制2048个字符
- 从语义的角度来回答
- get是获取资源的,是安全的、幂等的、可缓存的
- post是处理资源的,非安全的、非幂等的、不可缓存的
连接建立流程
HTTP的特点
无连接 - HTTP的持久连接?
无状态 - Cookie、Session
HTTP的持久连接
目的:提升网络请求效益和减少损耗
头部字段设置
- Connection:keep-alive
- time:20
- max:10
如何判断一个请求是否接受
- Content-length:1024?
- chunked:最后会有一个空的chunked
HTTPS与网络安全
HTTPS = HTTP + SSL/TLS
流程
会话秘钥:= random S + random C + 预主秘钥
预主秘钥:户端自己生产预主密钥,通过公钥加密预主秘钥,将加密后的预主秘钥发送给服务器 (Client Exchange)
公钥:
私钥:
HTTPS都使用了那些加密手段,为什么?
连接建立过程使用了非对称加密,非对称加密很耗时
后续通信过程使用对称加密
TCP/UDP
传输层协议
TCP 传输控制协议
- 面向连接 - 三次握手(可以解决同步连接超时问题)、四次挥手(全双工,两边都需要释放)
- 可靠传输 - 无差错、不丢失、不重复、按序达到
- 停止等待协议- 无差错情况、超时重传、确认丢失、确认迟到
- 面向字节流 - 根据情况拆分和合并传输给接收方
- 流量控制
- 滑动窗口协议 属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量。
- 拥塞控制
- 慢开始,拥塞编码
- 快开始,快重传
UDP 用户数据报协议
特点
- 无连接
- 尽最大努力交付
- 面向报文,既不合并,也不拆分
功能
-
复用、分用 (IP端口针对客户端还是服务端的复用和分用)
-
差错检测
DNS解析
了解DNS解析吗?
域名到IP地址的映射,DNS解析请求采用UDP数据报,且明文传输
DNS解析查询方式?
- 递归查询
- 我给你问一下
- 本地DNS->根域DNS->顶级DNS->权限DNS
- 迭代查询
- 我告诉你谁知道
- 根域DNS-顶级DNS-权限DNS 中间是本地DNS去对应询问
DNS解析常见问题?
- DNS劫持
- 如何解决
- httpDNS
- 长连接
- 如何解决
- DNS解析转发问题
- DNS劫持与HTTO的关系
- 没有关系
- DNS解析发生在HTTP建立连接之前
- DNS解析请求使用UDP数据报,端口号53
Session/Cookie
HTTP协议无状态特点的补偿
Cookie
Cookie主要用来记录用户状态,区分用户;
状态保存在用户端
怎么修改Cookie
新的覆盖旧的
属性需要和旧的一样
怎么保证Cookie安全
- 对Cookie进行加密处理
- 只在https上携带Cookie
- 设置Cookie为httpOnly,防止跨站脚本攻击
Session
Session主要用来记录用户状态,区分用户;
状态保存在服务器端
Socket
Socket是什么
socket的引入是为了解决不同计算机间进程间通信的问题 Socket接口是TCP/IP、UDP/IP网络的API接口函数,其介于应用层和传输层之间
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
Socket连接参数设置
第一个参数addressFamily IPv4(AF_INET) 或 IPv6(AF_INET6)。 第二个参数 type 表示 socket 的类型,通常是流stream(SOCK_STREAM) 或数据报文datagram(SOCK_DGRAM) 第三个参数 protocol 参数通常设置为0,以便让系统自动为选择我们合适的协议,对于 stream socket 来说会是 TCP 协议(IPPROTO_TCP),而对于 datagram来说会是 UDP 协议(IPPROTO_UDP)。
服务器工作流程
- 服务器调用 socket(...) 创建socket;
- 服务器调用 listen(...) 设置缓冲区;
- 服务器通过 accept(...)接受客户端请求建立连接;
- 服务器与客户端建立连接之后,就可以通过 send(...)/receive(...)向客户端发送或从客户端接收数据;
- 服务器调用 close 关闭 socket;
客户端工作流程
- 客户端调用 socket(...) 创建socket;
- 客户端调用 connect(...) 向服务器发起连接请求以建立连接;
- 客户端与服务器建立连接之后,就可以通过 send(...)/receive(...)向客户端发送或从客户端接收数据;
- 客户端调用 close 关闭 socket;
心跳包
心跳就是用来检测TCP连接的双方是否可用
**这里我们需要说明的是TCP的KeepAlive
机制只能保证连接的存在,但是并不能保证客户端以及服务端的可用性.**比如会有以下一种情况:
某台服务器因为某些原因导致负载超高,CPU 100%,无法响应任何业务请求,但是使用 TCP 探针则仍旧能够确定连接状态,这就是典型的连接活着但业务提供方已死的状态。
这个时候心跳机制就起到作用了:
- 我们客户端发起心跳Ping(一般都是客户端),假如设置在10秒后如果没有收到回调,那么说明服务器或者客户端某一方出现问题,这时候我们需要主动断开连接。
- 服务端也是一样,会维护一个socket的心跳间隔,当约定时间内,没有收到客户端发来的心跳,我们会知道该连接已经失效,然后主动断开连接。
重连机制
理论上,我们自己主动去断开的Scoket
连接(例如退出账号,APP退出到后台等等),不需要重连。其他的连接断开,我们都需要进行断线重连。
一般解决方案是尝试重连几次,如果仍旧无法重连成功,那么不再进行重连。
网络相关面试总结
- HTTP中的GET和POST方式有什么区别?
从语义回答
GET是安全的,幂等的,可缓存的,POST反之
- HTTPS连接建立流程是怎样?
- 流程图回答
- TCP和UDP的区别
- UDP:无连接、尽可能交付,面对报文(不拆分、不合并)
- TCP:面向连接、可靠传输、面向字节流、拥塞控制、流量控制
- 请简述TCP的慢开始过程
- 拥塞控制回答
- 客户端怎样避免DNS劫持
- httpDNS
- 长连接
- TCP粘包