哎哟哟,听说你TCP/IP协议掌握得不错呢,进来看看有你不会的吗?
1. TCP简介
- TCP是面向连接的、可靠的,基于字节流的传输层通信协议
- 将应用层的数据流分割成报文段并发送给目标节点的TCP层
- 数据包都有序号,对方收到则发送ACK确认,未收到则进行重传
- 使用校验和来检验数据在传输过程中是否有损失
2. TCP
2.1 TCP中重要的控制位(Control Flag)
- ACK:确认序号标志
- SYN:同步序号,用于建立连接
- FIN:用于释放连接
- URG:紧急指针标志
- PSH:push标志
- RST:重置连接标志
3. 三次握手,握手为了你我之间的联系
- 第一次握手:建立连接时,用户端发送SYN包到服务器,等待服务器确认
- 第二次握手:服务器收到SYN包,必须确认客户的SYN,同时发送SYN+ACK包给客户端
- 第三次握手:客户端收到SYN+ACK包后,向服务器发送确认包ACK,此包发送完毕,服务器接收,进入连接状态
3.1 为什么需要三次握手才能建立连接?
为了初始化Sequence Number的初始值,如图上的seq,要进行互相通知,作为以后数据通信的序号,保证以后传输的数据正确性,防止乱序
3.2 建立连接后,client出现故障怎么办?
- 服务器的保护机制
由服务器向客户端发送保活探测报文,如果未收到响应则继续发送,直到达到保活探测次数仍未收到回应,则会中断连接
4. TCP的四次挥手
- 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传输
- 第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认需要为收到的序号+1
- 第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传输
- 第四次挥手:客户端在收到服务器发送的FIN后,发送一个ACK给服务器,确认序号为收到的序号+1,与服务器的连接进入关闭状态,完成四次挥手
4.1 为什么第四次挥手后,客户端再等待2MSL才能关闭连接?
- 确保有足够的时间让服务器收到ACK包
- 避免新旧连接的混淆
4.2 为什么四次挥手才能断开连接?
因为客户端和服务器是全双工通信,发送方和接收方都需要发送FIN包和接受ACK包才能断开连接,由一端先发起断开连接的请求,所以看起来像四次挥手。
全双工通信:又称为双向同时通信,即通信的双方可以同时发送和接收信息的信息交互方式。
5. UDP
5.1 UDP报文头
- 特点:
- 面向非连接,不维护连接状态,支持同时向多个客户端传输相同的信息
- 数据包报头只有8字节,额外开销较小,
- 吞吐量只受限于数据生成速率,传输速率以及计算机的性能
- 尽最大努力交付,不保证数据的可达
- 面向报文,不对应用程序提交的报文信息进行拆分或者合并
5.2 TCP与UDP的区别
- 面向连接VS面向无连接
- 可靠性VS不保证可靠性
- 数据有序性VS数据无序性
- 速度慢VS速度快(UDP应用于视频、广播等)
- 重量级VS轻量级
6. TCP滑动窗口
- RTT:发送一个数据包到收到一个ACK所需的时间
- RTO:重传时间间隔
- TCP利用滑动窗口实现流量控制,并保证TCP的可靠性
6.1 高速重发机制
在窗口较大,又出现报文段丢失的情况下,同一个序号的确认应答将会被重复不断地返回(比如第1001~2000数据丢失,那么接受端会不断地返回下一个数据是1001的应答),而发送端主机接收到连续3次同一个应答,就会对其进行重发。
6.2 流量控制
如果接收端将本该接收到的数据丢弃的话,就会引起重发机制,从而导致流量的浪费。接收端向发送端主机通知自己能够接收数据的大小,于是发送端会发送不超过该数据大小的数据。该数据大小限度就是窗口的大小,是由接收端主机决定的。TCP首部报文中包含窗口大小的数据。
7. HTTP
7.1 特点
- 支持客户/服务器模式
- 简单快速
- 灵活
- 无连接
- 无状态,对事务处理没有记录
7.2 请求和响应的步骤
- 客户端连接到web服务器
- 发送http请求
- 服务器接收请求并返回http响应
- 释放tcp连接
- 客户端浏览器解析HTML内容
7.3 在浏览器输入URL地址,按下回车键之后发生了什么?
- DNS解析(将对应的地址解析为IP地址)
- TCP连接(三次握手)
- 发生HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 断开连接(四次挥手)
7.4 HTTP状态码
- 1XX:指示信息
- 2XX:成功
- 3XX:重定向
- 4XX:客户端错误
- 5XX:服务器端错误
7.4.1 常见的状态码
- 200 OK
- 400 Bad Request:客户端请求语法错误
- 401 Unauthorized:请求未经授权
- 403 Forbidden:服务器收到请求,但是拒绝访问
- 404 Not Found
- 500 Internal Server Error:服务器发生不可预期的错误
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
7.5 Get和Post的区别
- Http报文层面:Get请求放在URL地址上;Post放在报文体内
- 数据库层面:Get是查询操作;Post会改变数据库的数据
- Get可以被缓存,被存储;Post不能
7.6 Cookie和Session
7.6.1 Cookie
- 是由服务器发给客户端的特殊信息,以文本的形式存放在客户端
- 客户端再次请求的时候,会把Cookie回发
- 服务器接收到后,会解析Cookie生成相应的内容
7.6.2 Session
- 服务器端的机制,在服务器上保存信息
- 解析客户端请求并依据Session Id返回信息
7.6.3 两者的区别
- Cookie数据存放在客户端的浏览器上,Session数据存放在服务器上
- Session相对于Cookie更安全
(若考虑减轻服务器负担,应当使用Cookie)
8. HTTPS
8.1 SSL(Security Sockets Layer,安全套接层)
- 为网络通信提供安全及数据完整性的一种安全协议
- 是操作系统对外的API,SSL3.0后更名为TLS
- 身份验证和数据加密,保证网络通信的安全和数据的完整性
8.2 加密的方式
- 对称加密:加密和解密都使用同一个密钥
- 非对称加密:加密和解密使用不同的密钥(公钥和私钥,安全,但是效率低)
- 哈希算法:将任意长度的信息转换为固定长度的值,算法不可逆转
- 数字签名:证明某个消息和文件是某人发出的/认同的
8.3 HTTPS数据传输流程
- 浏览器将支持的加密算法发送给服务器
- 服务器选择一套浏览器支持的加密算法,以证书的形式发给浏览器
- 浏览器验证证书的合法性,并结合证书公钥加密信息发送给服务器
- 服务器使用私钥解密信息,验证哈希,加密相应消息后回发浏览器
- 浏览器解密相应消息,并对消息进行验证,之后进行加密加护数据
8.4 HTTPS和HTTP的区别
- HTTPS需要到CA申请证书,HTTP不需要
- HTTPS密文传输,HTTP明文传输
- 连接方式不同,HTTPS默认使用443端口,HTTP使用80端口
- HTTPS=HTTP+加密+认证+完整性保护,较HTTP安全
8.5 HTTPS真的安全吗?
- 浏览器默认填充http://,请求需要进行跳转,有被劫持的风险
- 可以使用HSTS优化