可靠性
为什么网络中会存在不可靠?
TCP协议格式
TCP中的6个标志位
序号和确认序号
了解确认应答机制
32位序号
32位确认序号
序号内容
为什么要用两套序号机制?
窗口大小
TCP的接收缓冲区和发送缓冲区
TCP的发送缓冲区和接收缓冲区存在的意义?
窗口大小
6个标志位
为什么存在标志位?
SYN
ACK
FIN
URG
PSH
RST
超时重传机制
连接管理机制
TCP的各种可靠性机制都不是主机到主机的,而是基于连接的.与连接是强相关的,如果不是基于连接的话,那么多个客户端发送数据,服务端只用一个缓冲区接受,那么会导致数据混乱
操作系统对连接的管理
三次握手
TCP在通信之前建立连接叫做三次握手
第一次握手:客户端向服务端发送SYN为1的报文,表示请求连接
第二次握手:服务端向客户端发送SYN和ACK为1的报文,表示请求连接并且接收到第一次握手(同意客户端的连接)
第三次握手:客户端发送ACK为1的报文,表示接收到第二次握手(同意服务端的连接)
三次握手会协商最大报文长度 (Maximum segment size(MSS)是TCP期望从对端接收的最大的报文长度),下面讲到的滑动窗口分组就是按照这个划分的
为什么是三次握手?
三次握手时的状态变化
套接字和三次握手的关系
四次挥手
由于双方维护连接都是需要成本的,因此当双方TCP通信结束之后就需要断开连接,断开连接的这个过程我们称之为四次挥手。
第一次挥手:客户端向服务端发送FIN为1的报文请求与服务端断开连接
第二次挥手:服务端收到客户端的请求后对其响应
第三次挥手:服务器收到客户端断开连接的请求,且已经没有数据需要发送给客户端的时候,服务端向客户端发送FIN为1的报文请求与服务端断开连接
第四次挥手:客户端收到服务端的请求后对其响应
为什么是四次挥手?
为什么不能将第二次和第三次挥手合并?
四次挥手的状态变化
套接字和四次挥手的关系
CLOSE_WAIT
TIME_WAIT
四次挥手中前三次丢包时解决方法
如果发出第4次挥手时就断开连接,那么第4次挥手丢包,服务端发起超时重传已经得不到响应了
虽然说过超时重传若干次后会也会强制关闭连接,但是服务端这段时间还在维护连接,这对服务端非常不友好,因此客户端并没有立刻断开连接,而是进入到TIME_WAIT状态
TIME_WAIT状态的必要性:
因此TCP并不能保证建立和断开的可靠性,但是可以保证建立后和断开前的通信的可靠性
TIME_WAIT时间不能太长,也不能太短
流量控制
TCP支持接收端的数据接收能力来决定发送端发送的速度,这个机制叫做流量控制
发送端通过接收端发送过来的窗口大小控制自己的发送数据
如果发送端接收到的窗口大小为0,此时发送端不应该发送数据,那么发送端如何得知什么时候可以继续发送呢??
16位数字最大表示65535,那么TCP窗口最大就是65535字节么?
滑动窗口
TCP为了保证发送效率,采取了连续发送多个数据的策略,而保证这个策略的机制叫做滑动滑动窗口
滑动窗口本质上就是两个整数来维护一段区间,我们假设记为left和right,left的左边是已经成功发送过去的数据,right的右边是待发送的数据,而这区间内是可能发送但是没收到应答或者待发送的数据
那么滑动窗口的left和right怎么滑动呢??
滑动窗口如何分组呢?
在三次握手阶段客户端会和服务端协商一个MSS,最大段大小,因此滑动窗口在分组是按照MSS分组的
快重传
拥塞控制
网络丢包不仅仅有双方主机的问题,也有网络的问题
如果大量丢包就要考虑网络的问题,比如网络拥塞,断网等
如何解决网络拥塞问题?
如果出现网络拥塞,主机不断的采用超时重传,那么只会让网络更加拥堵,
拥塞控制:为了解决这种问题,采取了慢启动的机制,就是一开是发生少量数据探路,摸清网络状况,在决定按照多大的速度进行传输,而慢启动的大小就是拥塞窗口的大小,所以滑动窗口配合窗口大小和拥塞窗口就可以很好的控制发送速度
慢启动设计:一开始采用指数增长,达到一定的筏值就采用线性增长,如果出现网络拥塞就重头开始,阀值变为当前拥塞窗口大小的一半
延迟应答
我们知道决定发送速度的是滑动窗口大小,那么怎么让滑动窗口变大点呢?
延迟应答可以控制:
捎带应答
就是接受方响应时同时将它要发送的数据发过去,这样在确保可靠性的前提下保证了效率
为啥会有三次挥手?
面向字节流
粘包
粘包的包是应用层的数据包,因此解决方案在于应用层
什么叫粘包?
解决方案:划清界限
UDP有没有粘包问题?
TCP异常情况
进程终止:会自动调用close,此时双方会在底层调用四次挥手
机器重启:机器重启和进程终止一样,会在重启前调用四次挥手
断电/断网:如果客户端断电/断网,服务端是无法知道的,因此它们之间的连接不会立刻断开,但是也不会一直维持,TCP有保活策略
TCP小结
保证可靠性的机制
提高性能的机制
基于TCP的常见应用层协议:
上一篇:sqlmap 使用篇
下一篇:九种跨域方式实现原理(完整版)