UDP
特点:无连接 不可靠传输 面向数据报 全双工
报文格式:
UDP数据报=UDP报头+UDP载荷(应用层数据报)
|
源端口 目的端口 报文长度 校验和
TCP
特点:有连接 可靠传输 面向字节流 全双工
作为传输层协议,首先就需要能表示端口号是啥。
4位首部长度: 指的是报头的长度.不是总tcp报文的长度.
选项:optional 可以通过选项,来选择加长或者不加长。
不加长的时候最少为20.
长度可以变长,最长可以变成60个字节。((首部长度的单位是4个字节)。实际的首部长度是要这个数字的基础上*4.所以为15*4=60)
保留6位
UDP报文长度使用2个字节表示。不能扩展
但是TCP提前申请好一块空间,即是保留位,为了后面发展拓展功能的时候就可以应用这个保留位了。
TCP协议的核心机制
1.确认应答机制
TCP协议来说,要要解决一个很重要的问题,可靠传输.(你发送方能够100%的把数据发送给接收方但是会尽可能.尤其是能够让发送方知道,接收方是否收到.).
在日常生活中,对人打招呼的时候,另一个人一般会回一个招呼,这样回复的应答数据就可以称为“应答报文”。
就是应答报文(1bit)。
但是会出现一种问题,当我们早期发消息的时候会有消息延迟,导致我问你了两个问题,你回复两个问题的时候会导致误会。
在网络传输中也会出现这种情况-》后发先至。
这样的问题在我网络通信的时候经常会出现,所以我们就要对传输的数据进行编号,这样就能让应答报文和发送的数据编号,对应起来,
给应答报文使用的(ack为1的时候才有效)这样的数据就可以根据确认序号区分出要应答哪个上面的报文了,
实际真实的tcp的序号不是按照“一条两条”方式来编号的而是按照“字节”来编号的.
此处报头中写的序号的数值就是载荷部分第一个字节的序号。
每个字节都有编号,字节的编号是连续递增的。
1)对于B来说,<1001的数据都已经确认收到了,
2)B再向A索要从1001开始的数据~~
可靠传输之所以能达成,主要就是依靠“确认应答”机制。
在日常生活中,每个交换机或者路由器是有上限的,当一个机器转发的信息量过多,合作社超出自己能处理的极限的时候,就会把接下来多出来的信息直接丢弃。
2.超时重传
A通过是否收到了ACK(b返回信息)来区分是否出现了 丢包的情况(A等待一定时间后,时间超过了某个阈值,没有收到ACK,就认为出现了丢包现象):
(1)就是A发送信息,B没有收到。
可以重新传输
(2)A发送信息,B接收到了,但是返回响应的时候,A没有收到。
如果B对相同的数据进行两个响应的时候就会出现bug,所以B会进行去重操作。通过发送的序号来去重。
B的内核态中有接受缓冲区,那会把接受的数据放入一个阻塞队列中,然后根据数据的序号来判定这个数据是否在队列中存在(或者曾经在队列中存在过)只要存在过,这个新的数据就不会进入队列,而是直接丢弃。
进入用户态:
调用accept拿到clientSocket拿到InputStream进行read
队列中的数据就会进入到用户态,但是他的序号会保存在这个阻塞队列中继续去重。
在其中也会根据序号自动来排序,让序号小的,在前头,序号大的在后头,并且数据和数据之间的序号始终都是连续的,这样就能提高效率。
超时重传,超时时间,是多少呢?
注意,这个时间,不是固定数值,而是会动态变化随着重传轮次的增加,会变的越来越长~~
这样重传的频率会越来越低,
如果达到一定重传次数就会尝试重置连接。
触发一个“复位报文”尝试重置连接(相当于连接重新开始)
重置就是通信双方清空之前tcp传输过程中接受缓冲区里里的数据啥的都不要了)
但是如果网络出现了严重故障,重置也没有用,就会断开连接 。
就会把信息删除掉。
TCP可靠传输,全靠确认应答和超时重传这俩机制支撑着。
3.链接管理
建立连接的流程:三次握手
两个机器,一见面,然后就进行打招呼,打招呼过程中,没有实质上的数据交互只是为了打招呼而传输一些数据
断开连接的流程:四次挥手
在握手和挥手的过程中,传输的网络数据报,不携带任何业务上的数据