TCP相关问题总结(包含三次握手四次挥手)
一、TCP协议段格式
源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;
32位序号/32位确认号: 保证可靠性
4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 60
6位标志位:
- URG: 紧急指针是否有效
- ACK: 确认号是否有效
- PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
- RST:对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
- SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
- FIN:通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段
16位窗口大小: 流量控制
16位校验和: 发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分.
16位紧急指针: 标识哪部分数据是紧急数据;
二、确保安全的机制
1. 确认应答机制
序号+确认序号实现。TCP将每个字节的数据都进行了编号, 即为***。每一个ACK都带有对应的确认***,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发。
2. 超时重传机制
主机A发送数据给B之后, 可能因为网络拥堵等原因, 数据无法到达主机B;
如果主机A在一个特定时间间隔内没有收到B发来的确认应答, 就会进行重发。
TCP内部实现,动态计算的。以单方向数据传输最大时间* 2作为超时时间(数据传输一去一回的时间)
3. 连接管理机制
TCP要经过三次握手建立连接, 四次挥手断开连接
(1)三次握手
三次握手的流程:
1.客户端发送SYN建立连接的请求到服务器
2.服务器响应SYN+ ACK的数据给客户端,此时建立了客户端到服务器的连接
3.客户端发送ACK的响应给服务器,此时建立服务器到客户端的连接
总之,连接都是单方向的,需要发送SYN并接收到ACK才算建立好连接
(2)四次挥手
四次挥手的流程:
1.客户端发送FIN关闭客户端连接的请求到服务器
2.服务器系统响应ACK给客户端(状态设置为CLOSE_ WAIT)
3.服务器程序发送FIN关闭服务器连接的请求给客户端
4.客户端响应ACK给服务器(客户端状态设置为TIME WAIT),服务器接收到后关闭连接
问:是否能减少为3次挥手?
答:不能。减少的一次数据传输,只能通过合并第二次和第三次数据报,但第二次发从的ACK是由系统实现,第三次是由程序调用close()方法发送FIN关闭连接。
4. 流量控制
所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
应用背景 : 接收端能力有限,如果接收缓冲区被打满,会造成丢包等一系列问题。
原理 : 使用窗口大小字段,告诉发送端发送数据的大小。
5. 拥塞控制
背景:不清楚当前网络状态的情况下,贸然发送大量的数据,可能引发网络拥堵雪上加霜。
原理:TCP进行拥塞控制的算法有四种,即慢开始、拥塞避免、快重传和快恢复。
(1)慢开始机制:先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据;
当cwnd = ssthresh时,既可使用受才姑异法,也可使用拥恭避兄异法。
(2)拥塞避免:算法的思路是让拥塞窗口拥塞窗口初始值为1,开始呈现为指数曲线,到达阈值后变为线性增长,比慢开始算法的拥塞窗口增长速率缓慢得多。
(3)快重传算法:规定发送方只要一连收到3个重复确认,就知道接收方确实没有收到报文段M3,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。
(4)快恢复算法:如图点❹发送方知道现在只是丢失了个别的报文段。于是不启动慢开始,而是执行快恢复算法。这时,发送方调整门限值ssthresh = cwnd/2,同时设置拥塞窗口cwnd = ssthresh,并开始执行拥塞避免算法。
三、确保效率的机制
1. 滑动窗口
作用:提高网络传输效率
原理:
(1)一去一回串行的网络数据传输,转变为并行的收发数据
(2)通过序号+确认序号保证数据传输的安全性
(3)为什么叫滑动、窗口?
窗口:无需等待确认应答而可以继续发送数据的最大值
滑动:并行发送数据报时,需要接收到ACK的响应报文才表示数据发送成功。而窗口是否能够滑动,以及能够滑动到哪个位置,都由ACK响应报文的下一个序号决定。具体是能滑动到ACK响应报文连续的最大确认序号。
2. 延迟应答
作用:提高网络传输效率
原理:如果接收数据的主机立刻返回ACK应答, 这时候返回的窗口可能比较小。接收到数据报时,马上响应ACK,而是延迟一段时间后再应答。这样可以增加滑动窗口的大小,提高网络吞吐量。
3.捎带应答
作用:提高网络传输效率
原理:合并发送数据报