「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」
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优化