目录
一台主机上出现了大量TIME_WAIT状态,什么原因?怎么解决?
一、协议格式
16位源端端口&16位对端端口:
描述通信两端。
32位序号:实现包序管理,完成数据有序交付
告诉接收端,这条数据在整体数据中的排序;接收端根据序号进行排序,
32位确认序号:确认应答&快速重传
向发送端进行回复确认,代表确认序号以前的数据都已经收到。
4位头部长度:
以4字节为单位描述tcp报文头部长度(最大60字节,最小20字节)。
6位保留:
暂未使用。
6位标志位:FIN, SYN, RST, PUSH, ACK, URG
16位窗口大小:用于实现滑动窗口机制,进行流量控制
16位校验和:二进制反码求和算法,校验数据一致性
16位紧急指针:指向紧急优先带外数据的结束位置
0~40字节选项数据(可无):通常是一些额外的协商信息
二、协议特性
1.面向连接
面向连接:通信前,需要先建立连接,以确保双方都是在线、具有数据收发能力。
连接管理&状态管理:三次握手建立连接,四次挥手断开连接
1.1三次握手建立连接
建立连接:通信前,先建立连接,确保双方具有数据收发能力。
连接管理:
状态管理:
1.2四次挥手断开连接
断开连接:通信结束,需要一个断开连接的过程,以避免发生意外。
注意:FIN请求,只能表示不再给对方发送数据,不代表不再接收数据。
连接管理:
状态管理:
为什么握手是三次,挥手是四次?
(1)为什么是三次握手?
因为两次不安全,四次没必要:
(2)为什么是四次挥手?
三次握手失败后,两端如何处理?
一台主机上出现了大量CLOSE_WAIT状态连接的原因?
TIME_WAIT状态的作用?为什么不直接关闭套接字?
一台主机上出现了大量TIME_WAIT状态,什么原因?怎么解决?
1.3TCP连接管理中的保活机制
问题引入:
保活机制:
连接断开在程序上层的体现:
2.可靠传输
可靠传输:确保数据安全有序的到达对端
TCP可靠传输所包含:
2.1可靠传输的实现
通过很多特殊机制实现:
2.2没必要的性能损失
2.3没必要的性能损失处理机制
2.4滑动窗口机制实现
滑动窗口机制中的三种特殊协议:
扩展了解:
2.5快速重传协议
2.6拥塞机制
避免因为网络拥塞而导致大量的丢包
2.7其他的一些提升性能的方式
3.提供字节流传输服务
3.1流式传输
是一种有序的、安全的、可靠的,基于连接的字节流传输。
3.2字节流传输
字节流传输:发送或接收最小单位为字节的传输方式。
(1)发送方将要发送的数据放到发送缓冲区中,系统截取合适大小的数据进行传输;
(2)接收方将接收到的数据,放到接收缓冲区中,上层recv需要多少,给多少。
优点:比较灵活,没有发送或接收长度的限制。
缺点:存在粘包问题。
3.3编程影响——粘包问题
粘包问题:
将多条数据当做一条数据进行处理(两个或多个包粘在一起当做一个处理)。
产生原因:
tcp对上层数据的边界不做特殊处理,没有数据之间的边界管理。
解决方法:
程序员在应用层进行数据之间的边界管理:三种方式
什么是TCP粘包?怎么产生的?怎么解决?
udp粘包怎么解决?
tcp和udp有什么区别?
udp:无连接,不可靠,面向数据报。
tcp:面向连接,可靠传输,面向字节流传输。
可扩充详谈
tcp怎么实现可靠传输?
见上,可靠传输的实现。
udp怎么实现可靠传输?
通过程序员自己在应用层实现确认应答机制、超时重传机制,来保证数据安全到达对端,并且对传输的数据包进行包序管理,实现数据的有序交付,确保数据能够有序到达对端。同理,还可以自己实现滑动窗口机制、拥塞控制,避免丢包重传,以及一些提升性能的机制。