TCP--传输控制协议
是一种面向连接的可靠传输协议--面向连接是发生在数据传输之前的连接
什么是面向连接呢?
在数据传输之前,先使用预备的协议(喊话),建立点到点的连接,然后再传输数据的过程
那么TCP又如何保证可靠性呢?
1.确认
2.重传
3.排序
4.流控--滑动窗口机制
那么TCP如何保证面向连接呢?
TCP的三次握手
TCP可以进行流控
TCP可以进行数据分段,也就是当一个数据太大时,可以分段慢慢传
TCP耗费资源比较大,并且传输速度比较慢
应用的场景:适用于效率较低,但是准确性要求较高的场景
协议:6
TCP协议的数据格式
TCP建立连接的过程--三次握手
首先我们先要了解TCP的几个标识符
SYN--请求标记位
ACK--同意确认位,ACK一旦为1激活后,那么ACKNO(确认序号)就被激活大小是seq+1
SEQ--代表序号,序号数字随机,只不过要按照顺序
FIN--结束标记位
1.客户端A想要访问服务器B的时候,此时客户端A就要向客户端发送一个SYN请求标记报文
2.B在收到A发送的请求标记位之后,回复A一个ACK同意确认位,到此为止,A指向B的会话建立完成
3.因为TCP会话是一个双向的过程,因此服务器B也要向客户端发送SYN请求标记报文
4.同理A收到B发送的请求标记位之后,回复B一个ACK同意确认位
那么综上所述,将2.3合并就可以得到
注:ACKNO=x+1的含义:我已经确认受到了序号seq=x,并且请求序号为seq=x+1的序号
TCP断开连接的过程--四次挥手
1.当客户端A想要与服务器B断开连接的时候,客户端A发送FIN结束标记位向B
2.服务器B在收到A发来的结束标记位的时候,将发送ACK同意确认,此时就结束了A指向B的会话
3.因为TCP是双向的,如果B中还有要向A发送的数据,那么B先将数据全部发送完成之后,再向客户端A发送FIN结束标记位
4.A收到了B发来的FIN后,回复一个ACK确认报文
综上所述
那么我们可以发现出一个问题,为什么三次握手的2.3可以合并,四次挥手却不能呢??
因为三次握手的时候,中间是没有数据传输的,A和B可以同时创建,而四次挥手,B要首先判断自己的数据发送完成之后,才可以断开连接,如果A和B的数据一模一样,则也有可能会出现“三次挥手”的情况
UDP--用户数据报协议
是一种非面向连接的不可靠传输协议
UDP是无连接的协议
UDP不可流控
UDP不可用数据分段
UDP耗费资源比较小,传输速度快
应用场景:
适用于效率较高,但是准确性要求较低的场景(即时类通讯软件)
适用于直播,足球直播,讲究实时性的
协议:17
TCP和UDP的区别?
1.TCP是面向连接的协议,而UDP是无连接的协议
2.TCP协议的传输是可靠的,UDP协议的传输“尽力而为”
3.TCP可以实现流控,但是UDP不行
4.TCP可以实现分段,而UDP不行
5.TCP协议传输效率慢,占用资源大;UDP协议传输效率快,占用资源少
那么如何实现可靠的UDP协议呢?
UDP协议以其简单,传输快的优势,在越来越多的场景下取代了TCP,如实时游戏
1.网速的提升给UDP的稳定性提供了可靠的网络保障,丢包率很低,如果使应用层重传(不是传输层),则能够保证传输的可靠性
2.TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP内置的系统协议栈中,极难对其进行改进。
采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收后再继续发送,延时会越来越大,基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,将包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响