不管面试 Java 、C/C++、Python 等开发岗位,有关TCP的知识点总是一个热点问题
每次面对这类面试题的时候,真的是又爱又狠….
不过没关系,今天就让我们来消除这份恐惧,微笑着勇敢的面对它吧!
1.讲一下什么是网络协议?
计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议.
而TCP/IP 是互联网相关的各类协议族的总称。
2.这些协议有哪几层有了解吗?
这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层
链路层:负责封装和解封装IP报文,发送和接受ARP/RARP报文等。
网络层:负责路由以及把分组报文发送给目标网络或主机。
传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。
应用层:负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。
3.可以讲一下什么是TCP吗?
TCP 协议属于4层传输层。它是面向连接的、可靠的、基于字节流的传输层通信协议。
4.可以具体一点吗?
面向连接:一定是「一对一」才能连接,不能像 UDP 协议 可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;
字节流:消息是「没有边界」的,所以无论我们消息有多大都可以进行传输。并且消息是「有序的」,当「前一个」消息没有收到的时候,即使它先收到了后面的字节已经收到,那么也不能扔给应用层去处理,同时对「重复」的报文会自动丢弃。
5.那你知道什么是 TCP 连接
用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。
6.可以详细阐述一下它们各自的意思吗?
Socket-由 IP 地址和端口号组成;
序列号-用来解决乱序问题等;
窗口大小-用来做流量控制。
7.如何唯一确定一个 TCP 连接呢?
TCP 四元组可以唯一的确定一个连接,四元组包括如下:
1.源地址
2.源端口
3.目的地址
4.目的端口
8.那他们有什么作用呢?
源地址和目的地址的字段(32 位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。
源端口和目的端口的字段(16 位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。
9.UDP 和 TCP 有什么区别呢?
9.1.连结
TCP 是面向连接的传输层协议,传输数据前先要建立连接。
UDP 是不需要连接,即刻传输数据。
9.2.服务对象
TCP 是一对一的两点服务,即一条连接只有两个端点。
UDP 支持一对一、一对多、多对多的交互通信。
9.3.可靠性
TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
UDP 是尽最大努力交付,不保证可靠交付数据。
9.4.拥塞控制、流量控制
TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
9.5还有一个是关于首部开销的。
TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的。
UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
10.你刚才提到了的TCP首部长度。那么为什么 UDP 头部没有「首部长度」字段,而 TCP 头部有「首部长度」字段呢?
原因很简单。
TCP 有可变长的「选项」字段,而 UDP 头部长度则是不会变化的,所以无需再多用一个字段去记录 UDP 的头部长度。
11.它们有这么多区别。那应用场景又有何不同呢?
由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
- FTP 文件传输
- HTTP / HTTPS
由于 UDP 面向无连接,它可以随时发送数据,再加上 UDP 本身的处理既简单又高效,因此经常用于:
- 包总量较少的通信,如 DNS 、SNMP 等
- 视频、音频等多媒体通信
- 广播通信
从上面的动态图可以得知,UDP只会把想发的数据报文一股脑的丢给对方,并不在意数据有无安全完整到达。
而TCP 是面向连接的、可靠的、基于字节流的传输层通信协议
总结
TCP向上层提供面向连接的可靠服务 ,UDP向上层提供无连接不可靠服务。
虽然 UDP 并没有 TCP 传输来的准确,但是也能在很多实时性要求高的地方有所作为
对数据准确性要求高,速度可以相对较慢的,可以选用TCP。
好了,今天的分享就到此。下期给大家分享TCP的三次握手和四次挥手!