TCP 传输层面试中常问的问题汇总(你所不知道的传输层)
linux 服务器开发相关视频解析:
tcpip,accept,11个状态,细枝末节的秘密,还有哪些你不知道
c/c++ linux 服务器开发免费学习地址:c/c++ linux后台服务器高级架构师
1. 传输层的主要功能是什么?
2. 传输层如何区分不同应用程序的数据流?
3. 传输层有哪些协议?
4. 什么是 UDP 协议?
5. 为什么有了 UDP,还需要 TCP?
6. 什么是 TCP 协议?
7. 怎么理解协议和程序?
8. TCP 是否真的有链接?
9. 链接是如何建立的(逻辑上)?
10. 所谓的建立 TCP 链接开销很大,具体是指什么?
11. 三次握手的目的是什么?
12. TCP 如何提供可靠性?
13. 什么是预期确认?什么是肯定确认与重新传输?哪些情况会重传?
14. TCP 中,序列号和应答号有哪些作用?
15. TCP 链接中,网络失败,是怎么判断的?
16. 为什么需要窗口技术?
17. 如何实现流量控制?
18. UDP 的开销很小,具体是指什么?
19. UDP 数据包、TCP 数据包大小如何确认?
20. UDP 适合哪些环境?TCP 适合哪些环境?
一、传输层的主要功能是什么?
分割并重新组装上层提供的数据流,为数据流提供端到端的传输服务。
二、传输层如何区分不同应用程序的数据流?
因为,对应传输层而言,它只需要知道目标主机上的哪个服务程序来响应这个程序,而不需要知道这个服务程序是干什么的。因此,我们只需要能够抽象的表示出来这些应用程序和服务程序即可。我们使用端口号来抽象标识每个网络程序。
![](https://static001.geekbang.org/infoq/c6/c6613874c2dd7064fa9e07303a3849ce.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
因此:在同一 IP 地址(同一个目标主机)上不同的端口号是两个不同的链接。IP 地址和端口号用来唯一的确定网络上数据的目的地。
三、传输层有哪些协议?
传输层的两大协议:TCP(传输控制协议)UDP(用户数据包协议)
TCP 是一个可靠的面向链接的协议,UDP 是不可靠的或者说无连接的协议。
可以用打电话和发短信来说明这种关系:
UDP 就好似发短信,只管发出去,至于对方是不是空号(网络不可到达)能不能收到(丢包)等并不关心。
TCP 好像打电话,双方要通话,首先,要确定对方不是开机(网络可以到达),然后要确定是不是没有信号(),然后还需要对方接听(通信链接)。
四、什么是 UDP 协议?
UDP 数据包结构如下图所示
UDP 为应用程序提供的是一种不可靠的、无连接的分组交付,因此,UDP 报文可能会出现丢失、乱序、重复、延时等问题。因为它不提供可靠性,它的开销很小。(开销很小具体指什么?下文揭秘)
五、为什么有了 UDP,还需要 TCP?
问题 4 中已经说到,UDP 为应用程序提供的是一种无连接、不可靠的分组交付。当网络硬件失效或者负担太重时,数据包可能就会产生丢失、重复、延时、乱序的现象。这些都会导致我们的通信不正常。如果让应用程序来担负差错控制的工作,无疑将给程序员带来许多复杂的工作,于是,我们使用独立的通信协议来保证通信的可靠性是非常必要的。
六、什么是 TCP 协议?
传输控制协议 TCP 是一个面向链接的、可靠的通信协议。 1. 在开始传输前,需要进行三次握手建立链接 2. 可靠性:在传输过程中,通信双方的协议模块继续进行通信 3. 通信结束后,通信双方都会使用改进的三次握手来关闭链接
TCP 数据包结构如下图
七、怎么理解协议和程序?
如同我们自定义的应用层协议一样:协议只是给出了一组规范,规定我们应该怎么样(按什么规则)保存数据。
在计算机间传输的永远都是二进制字节码(对于传输层,可以理解为传输的始终是下层的 IP 数据包),是计算机中的程序通过对这些字节码进行逻辑分析、判断,来控制程序完成差错控制等功能。 至于解析这些字节码的程序,则可以有不同的实现,只要我们按照规则来解析,并作出相应的控制,我们大可以自己写个程序是实现相应功能。
八、TCP 是否真的有链接?
我们都知道,TCP 通过完成三次握手来建立链接的,但是这种连接是面向虚电路的,是物理上不存在的,只是双方的 TCP 程序,逻辑上的认为建立了这样的链接。
【文章福利】需要 C/C++ Linux 服务器架构师学习资料加群 812855908(资料包括 C/C++,Linux,golang 技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等)
![](https://static001.geekbang.org/infoq/47/47fda35f2d633d9f6f85deb4db0722c8.png)
九、链接是如何建立的(逻辑上)?
假设:当我们在主机 A 上启动一个程序,通过 TCP 去链接主机 B 上的 9091 端口。
![](https://static001.geekbang.org/infoq/a0/a02fc2bbdde20a4b28a786fadb3c9fef.png)
整个过程是怎么样的呢?逻辑上我们可以这么理解建立链接的过程:
1.SYN:seq=X;
1.1 A 的 TCP 程序,为这个链接分配一个端口(设为 9090)。
1.2 同时逻辑上的将 TCP 连接的状态设置为:正在连接。(通过在链接状态表中添加一条记录,记录中状态为:正在连接)
1.3 同时,随机生成一个初始序列号 X,生成一个 TCP 包,将初始化序列号 X 设置为 TCP 中的序列号,发送给主机 B。
2.SYN:seq=Y ACK:ack=X+1;
2.1 B 上 TCP 程序收到该数据包,查询 9091 端口状态,如果可以链接。
2.2 同样的,在逻辑上的将 TCP 连接的状态设置为:正在连接
2.3 同时,随机生成一个初始化序列号 Y,根据接收的序列号 X,生成应答号 X+1,生成一个 TCP 包,将序列号和应答号分别设置到 TCP 包头中,将 TCP 数据包发给主机 A。
3.SYN:seq=X+1 ACK:ack=Y+1.
3.1 A 上的 TCP 程序接收到数据包,查询 9090 端口状态。
3.2 根据收到的 SYN:seq=Y;ACK:ack=X+1; 封装一个 TCP 包 SYN:seq=x+1;ACK:ack=Y+1;发送给主机 B。同时,TCP 程序将链接状态表中该条记录状态设置为已连接。
3.3 主机 B 收到数据包,TCP 程序将链接状态表中该条记录状态设置为已连接。
至此,一个 TCP 链接建立(三次握手)完成。
我们可以看到:
第一:传送的都是 IP 数据包,其实只是将收到的数据包交给 TCP 程序处理。
第二:链接状态,只是 TCP 程序中的一个逻辑状态。
十、所谓的建立 TCP 链接开销很大,具体是指什么?
从九中,很容易看出。要简历 TCP 链接,必须进行三次 IP 数据包的成功传输。
十一、三次握手的目的是什么?
TCP 是面向链接的,在面向链接的环境中,开始传输数据之前,在两个中端之间必须先建立一个链接。建立链接的过程可以确保通信双方在发送应用程序数据包之前,都已经准备好了传送和接收数据。并且使通信双方统一了初始化序列号。
十二、TCP 如何提供可靠性?
在传输过程中,通信双方的协议模块继续进行通信,从而确保了传输的可靠性。 针对乱序:在通过三次握手进行链接时,序列号被初始化。在传输过程中,TCP 继续使用这个序列号来标记发送的每一个数据段,没传送一个数据段,序列号加一。接收方依据序列号重装收到的数据段。 针对丢包:在传输过程中,接收方收到一个数据段后,会用 ACK 应答码向发送端回复一个 IP 包进行应答,确认号 ACK 用来告诉发送端哪些数据包已经成功接收,发送方对未被应答的报文段提供重传。 针对重复:接收端收到数据段后,查看序列号,如果已经成功接收改数据包,则丢弃后面这个数据段。 针对延时:延时造成的第一个问题,就是数据包达到接收端时乱序。 当延时严重时,接收端一直未收到数据段,则不会回复 ACK,发送端认为丢包,重发。
十三、什么是预期确认?什么是肯定确认与重新传输?哪些情况会重传?
1.确认号 ACK 会告诉发送端哪些数据段已经成功接收,并且确认号会向发送端指出接收端希望收到的下一个序列号。即,确实号 ACK 为上个数据序列号+1,这种机制称为预期确认。
2.为了提高效率,我们在发送端,将数据段保存在缓冲区中,直道发送端收到来自接收端的确认号。这种机制被称为“肯定确认与重新传输”。
3.当发送端在给定时间间隔内收不到那个数据段的应答时,发送端就会重传那个数据段。 情况 1:网络延时/环路,数据段丢失 情况 2:网络延时,数据段推迟到达 情况 3:数据段成功到达,应答因为 1.2 不能达到。
十四、TCP 中,序列号和应答号有哪些作用?
从以上 10,11,12 中,很明显的可以看到
1、依靠序列号重组数据段
2、依靠数据包消除网络中的重复包
3、依靠序列号和应答号进行差错重传,提高了 TCP 的可靠性
十六、为什么需要窗口技术?
前面我们已经说了,TCP 的可靠性,是通过预期确认来实现的。即发送方发送一个数据段后,需要得到对方的确认后,才会发送下一个数据段。 因此,假设一个数据段大小为 64KB(IP 包最大值),一次发送和确认需要的时间为 500MS,则,1S 内,只能传送 128KB 的数据,如果带宽为 1M,显然很浪费带宽。为了充分利用带宽,我们使用窗口技术。滑动窗口允许发送方在收到接收方的确认之前发送多个数据段。(窗口大小决定了在收到确认前可以发送的数据段数量)
十七:如何实现流量控制?
窗口数决定了当前传输的最大流量。当我们在传输过程中,通信双方可以根据网络条件动态协商窗口大小,调整窗口大小时,即可实现流量控制。(在 TCP 的每个确认中,除了 ACK 外,还包括一个窗口通知)
十八、UDP 的开销很小,具体是指什么?
1.因为 UDP 是无连接的。在传输数据之前,不需要进行复杂的三次握手来建立连接。 2.在传输数据时,没有协议间通信流量(确认信号),也不需要浪费不必要的处理时间(接收确认信号再发一下)。 3;传输结束后,也不用再用改进的三次握手来端口连接。
十九、UDP 数据包、TCP 数据包大小如何确认?
1、无论 TCP 还是 UDP 数据包,都需要交给 Internet 层封装为 IP 包,而一个 IP 包,包头中的长度位为 16 位,所以 IP 包最大为 2 的 16 方,即 65535(64KB 还需要减去各种包头长度)。
2、TCP 因为面向流,且可以凭借序列号对大文件进行分段和重组,因此,TCP 可以用来传输较大的文件。而 UDP,如果要传输大于 64KB 的数据,则需要自己在应用层进行差错控制。
3、为了提高传输效率和减少网络通信量(协议间的通信),TCP 也会一次传输足够多的数据。
4、因为 MTU 的存在,TCP 包和 UDP 包不是越大越好。(在路由中分包,在接收端重组,加大路由与接收端负担,增大丢包概率。分组丢失,整个数据包重传。)
二十:UDP 适用哪些环境?TCP 适用哪些环境?
适合 UDP 的环境:
1、在高效可靠的网络环境中(不需要考虑网络不好导致的丢包、乱序、延时、重复等问题),因为 UDP 是无连接的服务,不用消耗不必要的网络资源(TCP 中的协议间通信)和处理时间(预期确认需要的时间),从而效率要高的多。 2、在轻权通信中,当需要传输的数据量很小(可以装在一个 IP 数据包内)时。如果我们使用 TCP 协议,那么,先建立连接,一共需要发送 3 个 IP 数据包,然后数据传输,1 个 IP 数据包,产生一个确认信号的 IP 包,然后关闭连接,需要传输 5 个 IP 数据包。使用 TCP 协议 IP 包的利用率为 1/10。而使用 UDP,只需要发送一个 IP 数据包。哪怕丢包(服务不成功),也可重新申请服务(重传)。
UDP 很适合这种客户机向服务器传送简单服务请求的环境。此类应用层协议包括 TFTP , SNMP , DNS ,DHCP 等。
3、在对实时性要求很强的通信中:在诸如实时视频直播等对实时性要求很高的环境中,从而允许一定量的丢包的情况下(直播比赛,前面丢失的包,重传出来已经意义不大了),UDP 更适合。(可以根据具体需要通过应用层协议提供可靠性,不用像 TCP 那么严格。)
适合 TCP 协议的环境:
当网络硬件失效或者负担太重时,数据包可能就会产生丢失、重复、延时、乱序的现象。这些都会导致我们的通信不正常的时候。如果让应用程序来担负差错控制的工作,无疑将给程序员带来许多复杂的工作,于是,我们使用独立的通信协议来保证通信的可靠性是非常必要的。
评论