目录
-
OSI模型和TCP/IP模型
-
概念
- OSI模型只是提供各种层的概念,TCP/IP模型则是对OSI的具体实现
-
OSI 7层模型
-
物理层
- 定义光纤的类型,各种传输介质的传输速率
- 网卡工作在这一层
-
数据链路层
- 可以对物理层中的数据进行检错
- 将物理层的数据封装成帧进行传输
- 交换机工作在这一层
-
网络层
- 为帧在路由器中选择最佳的传输路径
- 将网络地址翻译成对应的物理地址
- 路由器工作在这一层
-
传输层
- OSI模型中最重要的一层
- 作用
- 丢失的数据用不用重传
- 数据帧用不用顺序到达
- 规定适当的收发速率
- 将较长的数据宝进行强制分割
- 以太网无法接受大于1500字节的数据包
-
会话层
- 作用
- 解决不同操作系统之间数据传输的问题(Linux Windows)
- 作用
-
表示层
- 规定消息头的格式
-
-
-
TCP的三次握手
-
传输控制协议TCP简介
- 面向连接的、可靠的、基于字节流的传输层控制协议
- 面向连接的:通信之前需要建立连接
- 可靠的
- 数据包都有序号,对方收到就发送ACK确认,未收到则重传
- 使用效验来检验数据传输是否发生错误
- 面向连接的、可靠的、基于字节流的传输层控制协议
-
TCP报文头
- Source Port、Destination Port
- 用于指定发送方和接收方的端口号
- 端口号可以唯一确定一个计算机中的一个进程
- ip地址+协议+端口号 可以唯一确定互联网中任意一个进程
- 用于指定发送方和接收方的端口号
- seq
- 发送方用于告诉接收方,我当前发送的数据是从哪里开始的
- ack
- 发送方告诉接收方:接收方再给发送发发送数据的时候应该从哪里开始
- 下一个
- TCP Flags
- ACK
- 确认序号标志
- 1代表有效
- SYN
- 同步序号,仅仅用于建立连接的这个过程
- 1代表有效
- FIN
- finish标志,用于释放连接
- 1代表发送方已经没有要发送的数据了
- ACK
- Window
- 滑动窗口
- 表示接收的缓存大小,以此来控制发送方的发送速率
- Checksum
- 奇偶校验和
- Source Port、Destination Port
-
三次握手流程图
- 初始状态
- A和B都是关闭的
- 请求头(客户A发送的第一片报文)是不包含任何数据的
-
面试:说说TCP的三次握手
- TCP提供可靠的连接服务,需要三次握手来建立连接
- 第一次握手,客户端会向服务器发送一个SYN包,假设这个SYN包的Sequence number=a,然后客户端进入SYN_SEND状态,等待服务器确认
- 第二次握手,服务器收到客户端发来的SYN包,如果服务器可以与客户端建立连接的话就会发送一个SYN+ACK,假设这个Sequence number=b,ack=a+1,此时服务器进入SYN_RECV阶段
- 第三次握手,客户端收到服务器发来的SYN+ACK包,向服务器发送一个ACK的确认包,Sequence number=a+1,ack=b+1,此时,客户端和服务器都进入ESTABLISHED阶段,完成三次握手。
-
面试:为什么需要三次握手才能建立起连接
- 为了初始化Sequence number的值
- Sequence number作为通信的序号,可以保证应用层接收到的数据不是乱序的
-
面试:SYN超时--首次握手的隐患
- 隐患分析
- 就是前两次握手成功进行了,第三次握手没有成功进行
- 服务器会不断的重试,直至超时
- Linux系统默认等待63秒才会断开连接
- 第一次等待1秒,第二次2秒,第三次4秒,8秒,16秒,32秒。
- Linux系统默认等待63秒才会断开连接
- 坏人可能不断的只进行第一次握手,不进行第三次握手,短时间内用尽SYN队列,就会导致其他链接无法建立起来
- 预防SYN Flood攻击
- SYN队列满后,通过tcp_syncookies参数回发SYN Cookie
- 若是一个正常的连接,则客户端是可以同样回发一个SYN Cookie的
- 隐患分析
-
面试:建立连接之后,客户端突然出现故障咋办?
- 保活机制
- 开启保活机制的一方会向另一方发送保活探测报文,如果未收到响应就继续发送
- 当尝试次数已经超过保活探测次数而仍未收到响应,接收方就会被确定是不可达的,那么发送方就会中断连接
- 保活机制
-
-
TCP的四次挥手
-
概念
- 挥手是用于断开连接的
- 流程图
- CLOSE-WITE状态
- 服务器已经收到了关闭连接的请求,但是此时服务器还会再多留出一点时间,把最后剩余的数据也发出去
- TIME-WITE状态
- Linux的MSL的值是30s,所以整个TIME-WITE状态的持续时间是1min
-
面试:谈谈TCP的四次挥手
- TCP采用四次挥手来释放连接
- 第一次挥手:客户端向服务器发送一个FIN包(FIN=1,seq=u),然后客户端进入FIN_WITE_1状态
- 第二次挥手:服务器收到客户端的FIN包,服务器向客户端发送一个ACK包(ACK=1,seq=v,ack=u+1),然后服务器进入CLOSE_WITE状态
- 第三次挥手:服务器完成最后的数据发送,向客户端发送一个FIN包(FIN=1,ACK=1,seq=w,ack=u+1),然后服务器进入LAST_ACK状态
- 第四次挥手:客户端收到服务器发来的FIN包,客户端向服务器发送一个ACK包(ACK=1,seq=u+1,ack=w+1),然后客户端进入TIME_WITE阶段,服务器收到客户端的ACK包之后直接就进入了CLOSED状态,完成四次挥手
-
面试:为什么会有TIMEWITE状态
- 确保有足够的时间完成第四次挥手
- 如果客户端发送的ACK包服务器没有收到的话,那么服务器就会再次发送一个FIN包,这样一来一回的时间刚好是两个MSL,所以2个MSL时间一定能确保服务器如果没有收到ACK的包我客户端还可以收到服务器再次发来的FIN包
- 避免新旧连接的数据包发生混淆
- 因为有些路由器会缓存数据包,如果客户端没有经过TIME_WITE时间而立即建立下一个连接,那么上一个连接的数据包就有可能和下一个连接的数据包发生混淆
- 确保有足够的时间完成第四次挥手
-
面试:为什么需要四次挥手才能断开连接
- 因为TCP是全双工的,而且断开连接的话需要客户端和服务器都分别发送FIN报文和ACK报文,这样,客户端需要发送2次,服务器也需要发送2次,加起来就需要4次,所以就需要四次挥手才能断开连接
-
面试:服务器出现大量CLOES_WITE状态原因
- 这个时候一般都是服务器这边的原因,因为极有可能是服务器通知应用进程要关闭连接的,而应用进程却没有及时响应关闭连接,导致服务器的FIN报文一直没有发送出去,CLOSE_WITE状态达到上限,新的请求就无法被处理
- 解决办法
- 检查代码,特别是释放资源的代码
- 检查配置,特别是处理请求的线程配置
-
-
UDP
-
概念
- 用户数据报
- 报文结构
-
面试:UDP的特点
- 面向无连接的
- 不维护连接状态,支持同时向多个客户端传输同样的信息
- 额外开销小,报文头部只有8个字节
- 吞吐量只受限于数据生成速率、传输速率以及机器性能
- 尽最大了解交付,不保证可靠交付,不需要维持复杂的链接状态表
- 面向报文,不对应用程序提交的报文信息进行拆分或者合并
-
面试:TCP和UDP的区别
- 面向连接vs面向无连接
- 可靠性
- 有序性
- 速度
-
-
TCP滑动窗口
-
概念
- 重传机制
- RTT:从发送送一个数据包到收到对应的ACK所花费的时间
- RTO:重传时间间隔
- 客户
- 端发送一个数据包,如果超过RTO规定的时间还没有收到对应的ACK,就会触发重传机制
- 通过控制窗口的大小即可实现流量控制
- 重传机制
-
作用
- 可以实现流量控制和乱序重排
- 加快TCP的数据传输速率
-
滑动窗口相关概念
- 概念
- a:a之前的数据都已经全部发完并收到ACK确认了
- b:指向下一个要发送的报文
- c:c之后的报文是不允许发送的
- e:e之前的都是已经全部收到的报文
- g:g后面的报文就算收到也不会做处理的
-
滑动机制
- 发送窗口
- 只有最左端的收到ACK报文发送窗口才会向前移动
- 接收窗口
- 只有最左端的收到报文接收窗口才会向前移动
- 发送窗口
-
发送方的4种报文
- 已经发送并且收到确认的
- 已经发送未收到确认
- 没有发送但可以发送
- 没有发送且不允许发送
-
接收方的三种报文
- 已经接收到的报文
- 可以接收但还没有接收到的报文
- 可以接收但接收到不会发送确认的报文
-
-
HTTP
-
特点
- 支持客户/服务器模式
- 简单快速
- 灵活
- 可以传输任意类型的数据
- 无连接
- 不是udp的那个无连接,而是限制服务器每次只处理一个请求,处理完了之后就断开连接了
- 无状态
- 对事务处理没有记忆能力,意味着如果后续处理需要以前的信息则必须重传
-
面试:在浏览器地址栏输入URL,按下回车之后经历的流程
- DNS解析
- 先解析域名对应的ip地址,有了ip地址才能简历TCP连接
- 浏览器缓存
- 系统缓存
- 路由器缓存
- ips服务器缓存
- 根域名服务器缓存
- 顶级域名服务器缓存
- 先解析域名对应的ip地址,有了ip地址才能简历TCP连接
- TCP连接
- 使用ip地址和端口号建立tcp连接
- 三次握手
- 发送HTTP请求
- 浏览器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
- 四次挥手
- DNS解析
-
HTTP状态码
- 状态码分类
- 1xx
- 指示信息
- 表示请求已接收,继续处理
- 2xx
- 成功
- 3xx
- 重定向
- 要完成请求需进行进一步操作
- 4xx
- 客户端错误
- 请求有语法错误或请求无法实现
- 5xx
- 服务器端错误
- 服务器未能实现合法的请求
- 1xx
- 常见的状态码
- 状态码分类
-
面试:GET和POST的区别
- GET可以被浏览器缓存,而POST不能
- 如果想减轻服务器的压力,那就应该尽量使用GET请求
- GET可以被浏览器缓存,而POST不能
-
Cookie和Session
- Cookie
- 概念
- 是服务器给浏览器发送的特殊信息,以文本的形式存储在浏览器中
- 客户端再次请求的时候,会把Cookie发回
- 服务器接收到后,会解析Cookie生成与浏览器相对应的内容
- 概念
- Session
- 概念
- 服务器生成一个Session,并产生一个与之对应的Session Id
- 然后将sessionId放进cookie中返回给浏览器
- 概念
- 面试:Cookie和Session的区别
- Cookie存放在浏览器上,Session存放在服务器上
- Session更安全
- 如果想减轻服务器的压力,应尽量使用Cookie
- Cookie
-
-
HTTP和HTTPS
-
HTTPS
-
概念
- 超文本传输安全协议
- 他比HTTP协议多了一层SSL层
- 普通的HTTP协议全部都是明文传输,没有任何的加密,很容易被黑客劫持
-
加密方式
- 对称加密
- 加密和解密使用同一个秘钥
- 非对称加密
- 加密和解密使用不同的秘钥
- 很安全,但是效率要低很多
- 哈希算法
- 将任意长度的信息转为固定长度的值
- 算法不可逆
- MD5
- 数字签名
- 证明某个信息或某个文件是某人发出/认同的
- 对称加密
-
面试:HTTP和HTTPS的区别
- HTTPS需要到CA申请证书(需要花钱),HTTP不需要
- HTTPS密文传输,HTTP明文传输
- 连接方式不同,HTTPS默认使用443端口,HTTP默认使用80端口
- HTTPS=HTTP+加密+认证+完整性保护,较HTTP安全
-
面试:HTTPS真的安全吗?
- 浏览器默认填充http://,请求需要进行跳转,有被劫持的风险
- 服务器收到http协议的请求,会进行跳转,而在跳转的过程中是有被劫持的风险的
- 可以使用HSTS(HTTP Strict Transport Security)优化
- 不是主流,了解即可
- 浏览器默认填充http://,请求需要进行跳转,有被劫持的风险
-
-
-
Socket
-
概念
- 可以应用于多种传输协议,将协议里面的细节都封装起来了,形成一些基础的函数接口(create、connect、send、accept、read、close)
- socket起源于Unix,而Unix是基于一切皆文件的哲学,服务器和客户端各自维护一个socket文件,他们可以通过往socket文件中写入数据供对方读取,也可以读取对方往socket中写入的数据
-
socket通信流程
-