TCP流量控制
让发送方发送的速率不要太快,要让接收方开的及接收,防止发送方发送太快,导致接收方来不及接收。是端到端之间的控制
滑动窗口是实现流量控制的方法之一
TCP流量控制-滑动窗口
滑动窗口是传输层进行流控的一种措施,是实现流量控制的方法之一,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,达到防止发送方发送速度过快而导致自己被淹没的目的。
窗口的大小表示一次批量发送的数据量
滑动窗口过小会怎么样?
导致数据延迟
假设滑动窗口只有 1,那么每次只能发送一个数据,并且发送只有接收方对这个数据进行确认之后才能进行下个数据的发送,如果数据较大那么就需要不停的对数据进行确认,就会造成很大延迟
TCP阻塞控制
阻塞:对网络中某一资源(带宽、节点缓存等)的需求超过了该资源所能提供的可用部分
阻塞控制:防止过多的数据注入网络中,这样可以使网络中的资源不过载,阻塞控制是一个全局性的过程
阻塞控制的方法:慢启动、阻塞避免、快重传、快恢复
TCP阻塞控制-慢启动
慢启动是一种拥塞控制算法,通过逐步增加发送端每次发送的数据量来避免网络拥塞。当新的TCP连接建立时,由于不了解网络状况,慢启动算法能够确保发送端不会立即发送大量数据。刚开始阻塞窗口被设置为一个比较小的值,每当成功接收数据后,阻塞窗口会一直增长,直到达到某个设定的阈值或者发生丢包事件。
流量控制和阻塞控制的异同
相同点:都是为了防止数据丢失,实现机制都是让发送方发的慢一些,发的少一些
不同点:流量控制是让发送方的数据量与速度不要超过接收方的承受范围,是端到端之间的控制,阻塞控制是让发送方发送的数据量与速度不要超过网络中资源(带宽、节点缓存等)的承受范围,阻塞控制中其实接收方可能是能够承受比较大的数据的,但是网络中可能承受不了大数据,是全局性的控制。
TCP 粘包和拆包
粘包:发送端发送的若干包数据到接收端接收时粘成一包,也就是后一包数据的头紧接着前一包数据的尾。
拆包:一个完整的数据包被拆分成多个包进行发送,通常发生在发送端发送的单个数据包过大,超过其最大传输数量时
如何解决粘包和拆包问题
通过引入一些机制来标识数据包的边界
1、固定数据长度
2、在数据包之间插入一个特殊的分隔符,接收端通过查找这个分隔符来确定数据包的边界
3、自定义消息结构。 比如首先 4 个字节大小的变量来表示数据长度,真正的数据则在后面
TCP 和 UDP 的区别
(.精灵云)(.道生物联)(联想)(金美)
1、TCP 是一个面向连接的、可靠的、基于字节流的传输层协议。UDP是无连接的、不可靠的、基于报文的传输协议。
2、TCP首部需20个字节(源端口、目的端口、序列号、确认号、窗口、校验和等),UDP首部字段需8个字节(源端口、目的端口等)
3、TCP有流量控制和拥塞控制,UDP没有
4、TCP是一对一的连接,而UDP可以支持一对一,多对多,一对多。
5、TCP传输效率低,但可靠性高。UDP传输效率高,但可靠性低。
TCP为什么比UDP可靠
1、面向连接:TCP是面向连接的,三次握手和四次挥手
2、确认和重传:TCP有确认和重传机制(接收方收到报文就会确认,发送方发送一段时间后没有收到确认就会重传)
3、流量控制:TCP使用滑动窗口机制来实现流量控制,确保发送方不会发送过多的数据导致接收方无法处理。
3、阻塞控制:TCP有拥塞控制算法,如慢启动,避免网络拥塞和数据丢失。
TCP和UDP使用场景
TCP:适用于需要可靠传输的场景,如文件传输、邮件发送、网页浏览等
UDP:适用于对实时性要求较高、但对数据可靠性要求不高的场景,如语音通话、实时视频传输等
socket流程
(.海康)
1、服务器端
(1)socket()函数:创建一个socket
(2)bind()函数:将IP地址、port端口绑定到socket上
(3)listen()函数:使socket对象进入监听状态,等待客户端的连接请求
(4)accept()函数:接受客户端的连接
(5)用send()和recv()或者read()和write()收发数据
(6)close()函数:关闭连接
2、客户端
(1)socket()函数:创建一个socket
(2)connect()函数:链接服务器,需要指定服务器的IP地址和端口号作为参数
(4)用send()和recv()或者read()和write()收发数据
(5)close()函数:关闭连接