TCP 是互联网的核心协议之一,也是面试常被提及的一个基本概念,所以我将它的相关问题整理在下面。
我最近特别喜欢用发问的方式来解决问题,通过不断的发问和分解问题,能让一个复杂的问题变得简单,能让我的思路变得清晰明了。
针对这个面试题所提出的问题:
考察应聘者对于计算机网络的网络体系结构的了解。在考察 TCP/IP 五层模型中的传输层的 TCP 和 UDP 传输协议。
既然提到 TCP/IP 五层模型,我发现用「送家具」来表示TCP/IP五层模型,是一个不错的场景,在这里总结一下吧。
先假设一个场景,有一位王先生刚刚在郊区买了新房,家里还是空空的,去到市区里购置了很多件家具(床、沙发、凳子),然后就回到家中等候即可。下面就是购买后的运输过程:
(图片说明:图中的家具指代网络中的数据包,数据报从左向右发送)
比较常见的互联网体系模型有 OSI 参考模型和 TCP/IP 四层模型(没有物理层),每一层结构都有许多协议,如下图所示:
在互联网中的信息传递,就类似现实中的物品传输,不过这两种传输的细腻度不同。现实生活中,如果物品很小,就不需要进行拆卸,这样就会简化很多流程。在互联网中,数据只能以 0 和 1 来表示,所以每个数据包都相当于现实生活中的大物品,需要拆分和处理之后才能进行运输。
要熟悉 TCP 和 UDP 的区别,需要先了解下面的内容:
问2.1:TCP协议和UDP协议的概念是什么?
TCP 是传输控制协议(Transmission Control Protocol)的缩写。传输控制协议的定位是:面向连接的、可靠的、面向字节流的传输层通信协议。
(面向字节流的含义:最小发送单元由 TCP 确定,数据报只是一段无意义的字节流。如果数据报过大,会被切分成较小的单元进行发送)
UDP 是用户数据报协议(User Datagram Protocol)的缩写。用户数据报协议的定位是:简单的面向数据报的通信协议。
(面向数据报的含义:最小发送单元为数据报,应用程序交给 UDP 多大的数据报,UDP 就转发多大的数据报,不会理会数据报的大小)
问2.2:TCP协议和UDP协议的基本内容有哪些?
从程序实现的角度来观察TCP和UDP的不同点。
(图片说明:左侧是 TCP 服务端和客户端的数据传输过程,右侧是 UDP 服务端和客户端的数据传输过程)
从图中就能看出来他们最大的区别,TCP 面向连接,UDP 面向无连接。
TCP 的面向连接和面向字节流从而又产生了其他的特性。TCP的连接都需要经过确认,具有一定的可靠性。面向字节流意味着机器需要做更多的运算,降低了传输过程的效率,不太适用于大量的数据传输(视频传输)。
TCP针对自身的缺点(传输效率低),做了两种优化。
问2.3:他们的用途有何不同?这些用途是由于哪些基本内容导致的?
TCP 和 UDP 属于网络模型中的一个层次。应用层在传输不同类型的数据的时候,在传输层可以采用不同类型的传输层协议。其中 TCP/IP 的结构被广泛使用,但是 TCP 并不适用于所有应用。某些应用传输的数据允许有一定的失真率(视频、音频),如果依旧采用 TCP 会造成网络传输缓慢。
任何不是很需要可靠性或者是想将功能减到最少的应用可以避免使用 TCP。在很多情况下,当只需要多路复用应用服务时,用户数据报协议(UDP)可以代替 TCP 为应用提供服务。
总结:TCP 和 UDP 的使用需要根据具体的使用场景来分析,再确定选用哪一种类型的协议。它们的用途取决于它们传输效率。
传输过程来观察 TCP 和 UDP 的不同点。
问2.4:相关的网络攻击有哪些?怎么进行防御?
握手中的攻击手段:
TCP 攻击大部分都是参考强叔的教程,写得很通俗易懂,感兴趣的可以去看看,传送门
1. TCP三次握手原理是什么?为什么是三次握手而不是两次握手?
来源:Gcow 面试题、https://whale3070.github.io/interview/2020/05/19/11-x/
这里需要先了解 TCP 连接的建立过程。简而言之,三次握手四次挥手。
连接建立:三次握手。首先明确三次握手的目的,三次握手的目的在于让通信双方都确定准备完成(发送功能正常,接受功能正常)。
如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。也就是服务器无法判断客户端是否能正常收到消息。
2. 举例一些常见的协议以及对应的端口
来源:https://whale3070.github.io/experience/2019/10/11/05-x/
3. TCP/IP协议有哪 4 层?
来源:https://whale3070.github.io/experience/2019/10/11/05-x/