Java经典面试题之传输层的UDP和TCP部分(重点)(记得收藏面试前可以快速回顾)

首先我们了解传输层UDP和TCP之前要知道一些传输层前置知识:

UDP的可能考点和重点

1、整体构架图:

此处是书本整体图:

这是实际详细图:

2、UDP的校验和是什么?怎么工作的?

如何通过校验和进行数据校验?

这里要经过5个过程:

1、首先发送发把要发送的数据整理好(此处假设为data1),同时通过一定的算法,计算出校验和check1.

2、发送发把data1和check1通过网络一起发送出去。

3、接收方收到数据,假设收到的数据为data2(此时经过传输过可能和data1不同了),同时也收到了check1。

4、接收方根据收到的data2通过同样的算法计算出校验和check2。

5、最后接收方对比check1和check2是否一样,如果不一样则认为data1和data2不一样,反之如果check1和check2一样则认为data1和data2大概率相同(也有极小可能存在出错了但校验和相同的情况,但概率极低可忽略)。

此处要声明一点如果校验和传输过程出现错误而数据没错导致最终校验和不同,则也判定传输出错。因为我们的目的主要是判定这一次的网络传输有没有出现问题。

3、如何计算校验和

1、CRC算法:

2、md5算法

计算公式就不谈了肯定不会问(太难)主要谈特点:

1、定长:无论你原始数据是多长或者多短,你计算得到的md5都是固定的长度。

2、分散:给你2个原始数据哪怕他们只有一个字节不同,他们得到的md5都会差异很大。

3、不可逆:给你一个原始数据计算出md5很容易,但是你反过来计算出这个原始数据就很难,甚至理论上是不可行的,因此md5也很安全。

TCP可能的考点和重点(十个):

TCP方面主要就10个重点方面进行讲解,同时面试也基本就这10个里面提问!!!

首先我们要明确TCP的四大特性:

1、有链接

2、可靠传输(最核心的)

3、面向字节流

4、全双工

整体框图

1、确认应答

确认应答的本质就是接收方在收到发送方发送的数据后能够及时回应,来告诉发送方说“我”收到数据了。   确认应答是系统内核收到数据后的自主应答,其不包含其他业务,正常情况也无法干涉(后面的延时应答除外)!

如何排序/避免网络在经常出现的错序问题?

这里我们可以发送的数据进行排序

TCP在此处要做2个工作

1、确保应答报文和发出去的数据能对上号,不要出现歧义。

2、确保数据在网络传输过程中如果出现先发后置的现象,能够让应用程序仍按照正常的顺序理解数据。

此处通过ack数据包里面携带的“确认序号”告诉发送方法方,发送的数据已被收到,这样双方就有了解,就完成了一次可靠传输。

TCP的初心就是为了实现可靠传输,而可靠传输的关键就是确认应答!!!

此处可能的面试题:

面试官:TCP是如何保证可靠传输的?

答:通过确认应答为核心,借助其他机制辅助,最终完成可靠传输。

2、超时重传

首先我们要知道的一个情况就是:网络中数据传输丢包的可能是不可避免的,就行公路堵车一样,你不可能保证马路一年内都不堵一次。

这时候就有了超时重传。

为什么超时重传就可以大幅度提高数据被传过去的概率?

我们这里假设一次数据传输丢包的概率是10%,那么在第一次丢包的前提下再传一次又丢包的概率就变成了10% * 10% = 1%, 这里可以看到概率被明显降低了,此时如果再再传一次那么丢包的概率就会降到 震撼的   0.1%    !!!

所以重传就是一个很好的丢包下的补救措施。

当然在触发超时重传后发送方等待回应,也是有自己的时间限制的,但每一次等的都会比上一次等的时间长(相当于比较悲观了),当然拉长也是有限制的,最终等不到就会放弃连接(触发重置连接操作)。

当然如果路上传的慢接收方这边收到了重复的数据也没事,TCP有一个接收缓冲区,其实就是一个内存空间,它会保存当前的数据以及数据序号,当重复收到一份数据时就会丢弃后来的,以确保应用程序 read 的时候只有一个数据,同时这个接收缓冲区还会给收到的数据进行排序。

3、连接管理(3次握手,4次挥手)

建立连接(3次握手)

TCP的握手就是给对方发送一个简短的没有业务数据的数据包,通过这个数据包,来唤起对方的注意,从而进行后续的操作。(比如手机充电时的实际充电功率就是充电头充电线和手机接口在插上那一刻协商的结果)

TCP的三次握手过程是TCP协议建立连接的一个关键步骤,‌这一过程主要由操作系统的内核完成。‌当客户端调用 connect()函数时,‌内核会接管并完成TCP三次握手的过程,‌以建立与服务器的连接。‌

握手完成A和B就记录的对方的信息(也就是逻辑上的连接)。

如果按照一次一次计算应该是四次,就是A发送 syn,B回复 ack,B再发送 syn,A再 ack,但是实际上为了节约资源时间 B的操作可以合并成一次也就成了3次握手。

面试问题:三次握手是要解决什么问题?  四次握手是否可以? 两次握手,是否可行?

首先四次握手没有必要,两个数据可以合并一个,这样效率更高。

其次 三次握手的核心作用/解决的问题:

一、投石问路,确认当前网络是否畅通

二、让发送方和接收方都能够确认自己的发送能力和接受能力是否正常。

三、让通信双方,再握手的过程中,针对一些重要参数,进行协商(比如TCP通信过程的序号从几开始等)。同时每次协商都会协商出一个比较大和上次不一样的值,防止前朝的剑斩今朝的管(网络不好时及时丢弃老数据)。

两次握手肯定不行,这样会使一方无法接收对方的回应。

断开连接(4次挥手)

面试问题:

4、滑动窗口

我们前面说的3点都是在保证TCP的可靠性,但是TCP的可靠性会影响数据传输的效率(多出来一些等待ack 的时间,这样单位时间内传输的数据就减少了)

滑动窗口的出现就是为了让TCP在保证可靠性的同时尽可能减少对性能的影响

这里使用的方法就是缩短确认应答的等待时间

当然我们TCP的初心就是可靠传输,那么上述滑动窗口如果出现丢包怎么办?

两种情况:

最后说明一点,如果通信双方,传输的数据量比较小,也不频繁,就仍然是普通的确认应答和普通的超时重传。

如果通信双方,传输的数据量比较大,也比较频繁,机会进入到滑动窗口模式,按照上述的快速重传的方式处理。

5、流量控制

流量控制根本目的:就是站在接收方的角度,反向限制发送方的数据传输速率,也就是

发送方的发送速率,不应该超过接收方的处理能力。

我们要了解接收方是怎么处理收到的数据的:

具体图解如下:

6、拥塞控制

相较于流量控制,其实你整个通信路径的拥塞情况也是影响数据传输的关键

如果被面试问到,尽量画图给面试管讲这样更好拖时间和讲的更详细更容易让他不理解错你的意思!!!

7、延时应答

8、捎带应答

9、面向字节流(粘包问题)

10、异常处理

TCP 和 UDP的区别和对比

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值