UDP协议

UDP(User Datagram Protocol):用户报文协议 没有任何特点 和TCP对比:不可靠、无连接、面向报文 1. 网络的基本情况就是不可靠的

没有谁能保证数据一定是可以发送到对方的,可能丢失(丢包)即使数据发送给对方了,也不能保证数据就是无差错的(不考虑有人故意修改数据的情况)依次发送多个数据后,不能保证接收方按照发送顺序接收到数据(乱序),每次数据的发送,都是一次独立的寻找路径的过程

2. UDP作为一种最简单的传输层协议,基本上没有做什么的操作来帮助用户处理复杂的网络环境,所以UDP保留下来这种不可靠的特性。

3. UDP报文的头信息(定长的(8字节)) 4. 校验和(checksum)的作用和工作机制

判断收到的报文(数据)是否出现差错的利用hash函数的原理︰通过设计一种hash函数,达到冲突率很低的一种情况 发送端:checksum(payload)=>校验和1 (把校验和1填写到UDP的header 中) 接收端:checksum(payload)=>校验和2 比较校验和2和header 中的校验和1:如果不等,payload在传输过程中一定出现差错了;如果相等,大概率payload没有出现出错针对校验和可以对上的情况,正常接收数据。 针对校验和对不上的情况,直接丢弃包: UDP不是特别可靠

5.UDP协议栈的作用

计算校验和填写正确的header信息把 header + payload一起交给网络层 (重点:UDP没有发送缓冲区)网络层发送数据到网卡send方法返回 重点:我们在应用层调用send方法时send方法返回了,就意味着数据已经到达网络中

接收到数据之后

计算校验和解包通知指定的进程,数据已经到达…这段期间,进程可能还暂时来不及过来取数据。所以UDP协议栈需要找个地方把数据暂存一会儿。UDP协议栈中有接收缓冲区。

6. UDP有接收缓冲区,没有发送缓冲区 用户发送多少数据,UDP也会发送多少数据,所以UDP是面向报文的 UDP发送数据无需任何准备工作,随时随地可以发送:寄信vs打电话,所以UDP是无连接的

7. 面向数据报文导致的一个后果: 由于底层(物理层+网络层))都对一次发送的数据有大小限制。如果强行发送大于限制的数据,就会出现数据被截断。 全双工:同一个信道是双向的。

8. UDP协议的最适用场景 对实时性要求较高,对可靠性要求较低的场景 实时聊天(语音、视频聊天) UDP支持广播。如果有广播需求,也可以考虑用UDP。

TCP协议

TCP(Transmission Control Protocol):传输控制协议

目标:

以进程为单位传递数据追求可靠性

什么是可靠性?

TCP只能保证尽自己最大的可能,把数据有序地发送给对方。但不能保证一定能发送给对方。

尽可能去发送给对方即使发不过去,也有反馈保证对方接收是有序的保证对方不会收到差错数据TC会设计一些机制,来尽可能的优化网络,提高对方收到的可能性

TCP使用什么样的机制,来保证可靠性——确认应答机制

TCP发送的数据,一般被称为segment(数据段)应答: acknowledge

如果发送方同时发送了多条segment,应答进行了多次应答。发送方如何得知,接收方收到的是哪一次的segment? 编号机制:发送方为发送的数据做编号,应答的时候带上对应编号即可。如果接收方没有收到数据,则不会应答;或者接收方应答了,但应答丢包了 总之:发送方没有收到对应的应答。则认为对方没有收到数据——超时重传机制

TCP协议的header格式

和UDP不同,TCP的header 不是定长的。哪个或者哪些字段,可以保证接受方的TCP协议栈进行解包工作? 4位header长度根据源port+目标port做分用到目前为止,TCP发送的 segment有两种:(1.携带数据segment,⒉.应答segment),TCP协议并没有把两种作用的segment进行不同格式的设计,而是进行统一的设置了! 那具体怎么区分本次segment是否有应答的作用呢? ack ==1时segment有应答功能;ack == 0时segment没有应答功能segment的可能情况:(1)光携带数据;(2)携带数据+应答(网络中合并数据的发送,可以提高网络发送的效率)32位序号:SN(Sequence Number) 32位确认序号:ASN(Acknowledge Sequence Number)

SN和ASN书写规则

TCP为发送的每个字节都进行编号(只是payload,没有header)[h ello] h: 108(随便选的) ,e: 109 ,l: 110, l: 111, o: 112TCP协议栈在建立连接时,会随机一个初识序列号(Initial Sequence Number lSN)lSN : 108发送的时候,header 中的SN填写的是 payload 中的第一个字节的序列号 [ hello ] SN: 108 接收方是知道长度是5的,所以,接收方如果收到数据,则表示108 - 112已经全部收到了ASN应该如何填写?填写的是接收方期望收到的下一个字节的数据 上述例子中,接收方要应答的话ASN应该填写113。隐含的意思就是113之前的所有数据,已经全部接收到了。 如果发送方超过一定时间都没有收到应答,则可能 发送方的处理逻辑是一致的。超时之后,直接重传即可(重传的数据不会丢失),不需要区分情况如果乱序到达怎么办? 对于发送方,收到了一个应答segASN = x时,发送方是怎么理解这个信号的? 对方已经收到收到了x-1之前的所有数据了。 TCP协议是有接收缓冲区的,保证对方接收是有序的(接收端可以重新整理数据,接收过得数据不再接收)

如果超时之后,重传对方仍然没有收到,怎么办?

继续重传,直到到达一个阈值(假设6次)。如果6次,我都没有收到应答。我就认为不需要再努力的,放弃:

尽人事,试图通知对方,连接异常关闭了——通过发送一个reset segment(另一种)。 rst = 1,reset segment rst = 0,不是reset segment通知我们的应用层,数据发送失败了。(Java中是通过异常的方式通知的,会收到一个IOException (SocketException)描述reset connection)

连接管理(Connection Message)

为什么需要连接(连接是什么抽象)?

作为TCP协议栈,是需要维护一个接收缓冲区的。 (1)保证整理乱序到达的数据 (2)在数据暂时未被应用层读走之前,临时保存数据作为TCP协议栈,是需要维护一个发送缓冲区的。 因为要考虑重发的可能性,所以未应答的数据不能直接扔掉,所以需要一个空间暂存 例:send(‘hello’)成功,代表数据被发送到OS的TCP协议栈的发送缓冲区中作为TCP协议栈 发送方时,需要维护已经发送的SN 接收方时,需要维护应该应答的SN

上述3点,足以说明:TCР协议栈,为了保证之前的那些机制可用,必须为每个信道,维护一组相关的数据! !

建立连接阶段的必要性

由于TCP是追求可靠性的,所以TCP在正式发送数据之前,想验证下对象是否能收到我的数据。 类比:寄信+电话Connection对象,有一部分信息是无法独立知道的,需要双方进行有效信息的同步

TCP的建立连接,需要双方交换几次信息——三 次——三 次握手 [常见面试题]为什么是三次?为什么不是两次,为什么不是四次,为什么不是其他次? 4种segment:数据segment、应答segment (ack= 1)、reset segment (rst= 1)、同步segment (syn= 1)

什么是连接&为什么TCP需要有连接,UDP就没有连接。 逻辑上对信道的抽象。物理上各自内存中维护的信道相关的一组数据。 因为TCP为了追求可靠性引入一系列机制(确认应答机制,超时重传机制),为了这些机制能正常的工作,使得TCP必须引入连接的概念。为什么要有建立连接阶段的必要性

互相确认对象在线双方同步必要的初识信息 为什么是三次握手。

查看原文