UDP协议和TCP协议

UDP协议

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

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

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

3. UDP报文的头信息(定长的(8字节))
UDP协议和TCP协议_第1张图片
4. 校验和(checksum)的作用和工作机制

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

5.UDP协议栈的作用

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

接收到数据之后

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

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

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

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

TCP协议

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

目标:

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

什么是可靠性?

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

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

TCP使用什么样的机制,来保证可靠性——确认应答机制
UDP协议和TCP协议_第2张图片

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

TCP协议的header格式
UDP协议和TCP协议_第3张图片

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

SN和ASN书写规则

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

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

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

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

连接管理(Connection Message)

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

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

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

建立连接阶段的必要性

UDP协议和TCP协议_第7张图片

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

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

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

你可能感兴趣的:(udp,tcp/ip,网络)