【TCP】高频面试题

图片

前言

在IT行业的求职过程中,传输控制协议(TCP)作为网络通信的核心协议之一,其相关面试题常常出现在各大公司面试中。TCP的稳定性和可靠性是支撑互联网数据传输的基石,因此,对TCP有深入理解不仅能够帮助求职者获得面试官的青睐,更是每一个网络工程师必备的技能。本文将列出27个高频出现的TCP面试题及其答案,帮助求职者在面试前做好准备。

问题1:什么是TCP协议

TCP(Transmission Control Protocol)即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。它由IETF的RFC 793定义,为互联网中的数据通信提供了稳定的传输机制。TCP在不可靠的IP层之上实现了数据传输的可靠性,通过使用确认、重传和错误检测等技术来确保数据的正确到达。

TCP的特点:

  1. 面向连接:TCP在数据传输之前需要建立连接,通信结束后会断开连接。

  2. 可靠传输:TCP确保数据包正确无误地从源点传送到目的地,若数据包在传输过程中丢失或出错,会被重新发送。

  3. 全双工通信:TCP允许数据在两个方向上同时传输,提高了通信效率。

  4. 流量控制:TCP通过滑动窗口机制进行流量控制,避免快速发送方压倒慢速接收方。

  5. 拥塞控制:TCP实施拥塞控制策略来避免网络拥塞,如慢启动、拥塞避免、快速重传和快速恢复等。

  6. 有序传输:TCP保证数据按发送时的顺序到达接收端。

  7. 可变大小的滑动窗口:TCP使用可变大小的滑动窗口来动态调整数据传输速率。

问题2:TCP如何保证数据的可靠性

TCP通过序列号、确认应答、重传机制、流量控制和拥塞控制等机制来保证数据的可靠传输。

问题3:为什么说TCP是一种面向字节流的协议

TCP将数据视为一连串无边界的字节流,而不是一系列的消息,这意味着消息的边界不会在TCP头部中被保留。

问题4:TCP如何实现全双工通信

答案:TCP通过两个独立的缓冲区和两套不同的序列号来实现全双工通信,每个方向的数据传输互不干扰。

问题5:什么是TCP的头部结构

TCP头部至少包含源端口号、目的端口号、序列号、确认号、数据偏移、标志位、窗口大小、校验和、紧急指针和选项字段。

问题6:什么是滑动窗口机制

滑动窗口是一种流量控制机制,它允许发送方根据接收方的接收能力动态调整发送速率。

问题7:TCP的窗口缩放因子是什么

窗口缩放因子用于扩展TCP窗口的大小,使得在高速网络环境下可以更有效地利用带宽。

图片

问题8:解释三次握手过程

三次握手是建立TCP连接的过程,包括SYN(同步序列编号)、SYN-ACK(同步和确认)、ACK(确认)三个步骤。

问题9:TCP为什么需要三次握手

TCP需要三次握手的主要原因是防止旧的重复连接引起连接混乱问题,以及同步初始化序列号。在网络状况比较复杂或者网络状况比较差的情况下,发送方可能会连续发送多次建立连接的请求。如果TCP握手的次数只有两次,那么接收方只能选择接受请求或者拒绝接受请求,但它并不清楚这次的请求是正常的请求,还是由于网络环境问题而导致的过期请求,如果是过期请求的话就会造成错误的连接。三次握手可以实现TCP初始化序列号的确认工作,TCP需要初始化一个序列号来保证消息的顺序。如果是两次握手则不能确认序列号是否正常,如果是四次握手的话会浪费系统的资源,因此TCP三次握手是最优的解决方案。

图片

问题10:四次挥手是指什么

四次挥手是TCP关闭连接的过程,包括FIN(结束)、ACK(确认)、FIN(结束)、ACK(确认)四个步骤。

问题11:为什么挥手需要四次

TCP的四次挥手是为了确保数据流的正确和可靠地关闭。这需要双方都明确地确认关闭请求,并确保所有的数据包都已接收或处理。通过四次握手,每一方都可以确认对方已经完成了数据传输和接收的准备工作。

问题12:为什么TIME_WAIT等待的时间是2MSL

TIME_WAIT状态是TCP四次挥手中的一个重要状态,其持续时间通常是2MSL(最大段生存期)。这是为了确保在网络中的所有数据包都已过期并被丢弃,防止出现旧的数据包在网络中循环并导致连接错误关闭的问题。TIME_WAIT状态也提供了一个机会让发送方等待一段时间,以确保接收方已经收到了关闭连接的请求。

问题13:什么是TIME_WAIT状态

TIME_WAIT状态是TCP连接关闭过程中的一个状态,它确保最后一个数据包被对方成功接收,同时允许新的连接使用相同的端口号。

问题14:TCP中的拥塞控制是如何工作的

TCP的拥塞控制主要包括慢启动、拥塞避免、快速重传和快速恢复算法,目的是防止网络拥塞导致丢包。

问题15:解释TCP的拥塞窗口和接收窗口的区别

拥塞窗口是发送方用来限制发送速率以避免网络拥塞的窗口,而接收窗口是接收方根据自身接收能力设置的窗口,用来告知发送方自己能够接收的数据量。

问题16:TCP的超时重传机制是如何工作的

当TCP发送数据后,如果在规定时间内没有收到对方的确认应答,则会认为数据丢失并重新发送该数据包。

问题17:TCP的延迟确认是如何工作的

延迟确认是为了提高网络效率,接收方在收到数据后不立即发送确认应答,而是等待一段时间后再发送。

问题18:TCP的最大报文段长度(MSS)是什么意思

最大报文段长度(MSS)是指在不分段的情况下,TCP层能够接受的最大数据包大小。

问题19:TCP如何处理丢包的情况

TCP通过序列号和确认应答来检测丢包,一旦发现丢包,就会启动重传机制。

问题20:TCP的紧急数据是什么

TCP的紧急数据是指需要立即传输的数据,它由URG标志位标识,并使用紧急指针字段指示紧急数据的结束位置。

问题21:什么是Nagle算法

Nagle算法是一种减少网络中小规模数据包数量的算法,它尝试将多个小的数据包合并成一个大的数据包进行发送。

问题22:TCP和UDP的主要区别是什么

TCP是面向连接的、可靠的协议,而UDP是无连接的、不可靠的协议。TCP提供数据的顺序传输和错误校验,UDP则更加注重速度和效率。

问题23:TCP和HTTP之间有什么关系

HTTP是一种应用层协议,它通常运行在TCP之上,利用TCP提供的可靠数据传输服务来进行网页内容的传输。

问题24:什么场景下服务端会主动断开连接

第一个场景:HTTP 没有使用长连接 (Keep-Alive)机制 客户端或服务端禁用了 HTTP Keep-Alive;

第二个场景:HTTP 长连接超时 假设设置了 HTTP 长连接的超时时间是 60 秒,nginx 就会启动一个「定时器」 如果客户端在完后一个 HTTP 请求后,在 60 秒内都没有再发起新的请求,定时器的时间一到,nginx 就会触发回调函数来关闭该连接,那么此时服务端上就会出现 TIME_WAIT 状态的连接。

第三个场景:HTTP 长连接的请求数量达到上限。

问题25:已经建立了连接,客户端突然出现故障了怎么办

服务端的 TCP 连接将一直处于 ESTABLISH 状态,占用着系统资源。为了避免这种情况,TCP 有一个保活机制。

定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔,发送一个探测报文,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。

问题26:已经建立了连接,服务端的进程崩溃会发生什么

TCP 的连接信息是由内核维护的,所以当服务端的进程崩溃后,内核需要回收该进程的所有 TCP 连接资源,于是内核会发送第一次挥手 FIN 报文,后续的挥手过程也都是在内核完成,并不需要进程的参与,所以即使服务端的进程退出了,还是能与客户端完成 TCP 四次挥手的过程。

问题27:什么是SYN攻击?如何防御

SYN攻击是一种利用TCP协议缺陷进行的攻击,它通过发送大量的半连接请求来耗尽CPU和内存资源。SYN攻击属于DDoS攻击的一种,攻击者通常利用中病毒、木马的机器组织流量进行攻击。为了防御SYN攻击,可以采用多种方法,包括但不限于以下几种:

  1. 过滤网关防护:主要包括超时设置、SYN网关和SYN代理三种方法。其中,网关超时参数设置不宜过小也不宜过大,需根据网络应用环境来设置此参数。SYN网关使SYN网关连接数目增加,能够有效减轻攻击。SYN代理实际上代替了服务器去处理SYN攻击,此时要求过滤网关自身具有很强的防范SYN攻击能力。

  2. 加固TCP/IP协议栈:主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等。但tcp/ip协议栈的调整可能会引起某些功能的受限,管理员应该在进行充分了解和测试的前提下进行此项工作。

  3. 使用高防服务器:这是一种有效的防御手段,高防服务器或者接入高防产品可以进行防御。通常这些高防都有相对应的硬件防火墙可以有效抵抗市面上的SYN攻击,保障业务在遭遇攻击的同时还能有效的运行,不让客户遭受损失。

  4. 减少系统SYN等待时间:这只能缓解攻击。

  5. 对攻击源地址进行过滤拉黑:但是对于伪造精细的报文无效。

  6. 修改系统SYN-back-log上限:这只能缓解攻击。

  7. 将系统SYN的重发次数降低:这可以缓解攻击。

  8. 如果是linux系统,可以升级内核并设置SYN-cookies:这极大缓解攻击。

TCP 协议的例子

TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Java中,可以使用java.net包中的Socket和ServerSocket类来实现TCP协议的客户端和服务端通信。 以下是一个简单的Java TCP客户端和服务端的示例代码:

服务端代码:

import java.io.*;
import java.net.*;public class TCPServer {public static void main(String[] args) throws IOException {// 创建一个ServerSocket对象,监听8080端口ServerSocket serverSocket = new ServerSocket(8080);System.out.println("服务器启动,等待客户端连接...");// 调用accept()方法等待客户端连接Socket socket = serverSocket.accept();System.out.println("客户端已连接,IP地址:" + socket.getInetAddress().getHostAddress());// 获取输入流,读取客户端发送的数据BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));String msg = in.readLine();System.out.println("收到客户端消息:" + msg);// 获取输出流,向客户端发送数据PrintWriter out = new PrintWriter(socket.getOutputStream(), true);out.println("你好,客户端!");// 关闭资源out.close();in.close();socket.close();serverSocket.close();}
}

客户端代码:

import java.io.*;
import java.net.*;public class TCPClient {public static void main(String[] args) throws IOException {// 创建一个Socket对象,连接到服务器Socket socket = new Socket("localhost", 8080);System.out.println("客户端已启动,连接到服务器...");// 获取输出流,向服务器发送数据PrintWriter out = new PrintWriter(socket.getOutputStream(), true);out.println("你好,服务器!");// 获取输入流,读取服务器发送的数据BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));String msg = in.readLine();System.out.println("收到服务器消息:" + msg);// 关闭资源out.close();in.close();socket.close();}
}

结语

掌握TCP协议的相关知识对于网络工程师和IT从业者至关重要。本文列出的27个高频面试题旨在帮助求职者更好地准备面试,深入理解TCP协议的工作原理和关键特性。通过对这些问题的学习和思考,求职者不仅能够在面试中展现出自己的专业水平,还能够在实际工作中更加游刃有余地处理网络通信问题。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/256265.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构之模板方法等模式的使用

目录 一、程序编写背景 二、编程思路讲解 - 类图 - 实现逻辑 - 工厂模式 - 模板方法模式 接口类(代码)抽象类(代码)具体实现类(代码)工厂类(代码)注册类(代码&…

【Linux技术宝典】Linux入门:揭开Linux的神秘面纱

文章目录 官网Linux 环境的搭建方式一、什么是Linux?二、Linux的起源与发展三、Linux的核心组件四、Linux企业应用现状五、Linux的发行版本六、为什么选择Linux?七、总结 Linux,一个在全球范围内广泛应用的开源操作系统,近年来越来…

【Linux学习】线程详解

目录 十八.多线程 18.1 线程与进程 18.2 内核视角看待创建线程与进程 18.3 线程优缺点总结 线程的优点: 线程的缺点: 线程的用途: 18.4 线程与进程的联系 十九.线程控制 19.1 POSIX线程库 19.2 线程创建 19.3 线程等待 19.4 线程终止 19.5 线…

ChatGPT高效提问—prompt实践(生成VBA)

ChatGPT高效提问—prompt实践(生成VBA) 2. 生成VBA函数操作Excel ​ 当前Excel表格数据无背景颜色,区分不明显。假如我们想美化数据展示效果,把标题行设置为浅蓝色,其余奇数行设置为橙色,该怎么操作呢&am…

开启Android学习之旅-1

最近在学习《第一行代码 Android》,两天看书把所有代码都敲了一遍。由于之前没有接触过 Kotlin,导致了囫囵吞枣,跟着书会敲,离开就忘了。Android 大佬开发的各种框架、控件好像大部分都用了 Kotlin。看他们的源码,理解…

AI 消灭软件工程师?| 新程序员

【导读】“AI 是否会取代软件工程师”是自大模型爆火以来程序员们最为关心的一大话题,事关编程的未来与我们每一位程序员。本文作者 Babel CEO、多年的资深程序员张海龙深入技术本质,为我们进行了答疑解惑。 本文精选自《新程序员 007:大模型…

书生谱语-大语言模型测试demo

课程内容简介 通用环境配置 开发机 InterStudio 配置公钥 在本地机器上打开 Power Shell 终端。在终端中,运行以下命令来生成 SSH 密钥对: ssh-keygen -t rsa您将被提示选择密钥文件的保存位置,默认情况下是在 ~/.ssh/ 目录中。按 Enter …

【HTTP】localhost和127.0.0.1的区别是什么?

目录 localhost是什么呢? 从域名到程序 localhost和127.0.0.1的区别是什么? 域名的等级划分 多网站共用一个IP和端口 私有IP地址 IPv6 今天在网上逛的时候看到一个问题,没想到大家讨论的很热烈,就是标题中这个: …

如何把手机平板变为电脑的屏幕

文章目录 安装软件运行效果结尾 本文首发地址 https://h89.cn/archives/181.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 闲置的手机平板、触屏音箱等,均可作为电脑的扩展屏,为电脑增加一块显示屏,本文介绍如何使用免费的软件s…

Linux运用fork函数创建进程

fork函数: 函数原型: pid_t fork(void); 父进程调用fork函数创建一个子进程,子进程的用户区父进程的用户区完全一样,但是内核区不完全一样;如父进程的PID和子进程的PID不一样。 返回值: RETURN VALUEO…

Linux操作系统基础(十三):Linux安装、卸载MySQL

文章目录 Linux安装、卸载MySQL 一、卸载系统自带的mariadb-lib 二、上传安装包并解压 三、按顺序安装 错误1: 错误2: 错误3: 错误4: 四、初始化数据库 五、目录授权,否则启动失败 六、启动msyql服务 七、查看msyql服务的状态 八、在/var/log/mysqld.l…

CTFshow web(php命令执行 55-59)

web55 <?php /* # -*- coding: utf-8 -*- # Author: Lazzaro # Date: 2020-09-05 20:49:30 # Last Modified by: h1xa # Last Modified time: 2020-09-07 20:03:51 # email: h1xactfer.com # link: https://ctfer.com */ // 你们在炫技吗&#xff1f; if(isset($_GET[…

CVE-2018-19518 漏洞复现

CVE-2018-19518 漏洞介绍 IMAP协议&#xff08;因特网消息访问协议&#xff09;它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息&#xff0c;下载邮件等。它运行在TCP/IP协议之上&#xff0c;使用的端口是143。在php中调用的是imap_open函数。 PHP 的…

C++三剑客之std::optional(一) : 使用详解

相关文章系列 C三剑客之std::optional(一) : 使用详解 C三剑客之std::any(一) : 使用 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二)&#xff1a;深入剖析 目录 1.概述 2.构建方式 2.1.默认构造 2.2.移动构造 2.3.拷贝构…

Docker容器监控-CIG

目录 一、CIG说明 1. CAdvisor 2. InfluxDB 3. Grafana 二、环境搭建 1. 创建目录 2. 编写 docker-compose.yml 3. 检查并运行容器 三、进行测试 1. 查看 influxdb 存储服务 是否能正常访问 2. 查看 cAdvisor 收集服务能否正常访问 3. 查看 grafana 展现服务&#…

智能家居中可自行收集能量的无电池的无线设备

此图片来源于网络 1、背景 ZigBee是一种基于IEEE 802.15.4标准的低速短距离无线通信技术&#xff0c;用于创建个人区域网络。其名称来源于蜜蜂的八字舞&#xff0c;因为蜜蜂通过这种舞蹈来与同伴传递花粉的所在方位信息&#xff0c;从而构成了群体中的通信网络。ZigBee技术具…

AcWing 802. 区间和 离散化

文章目录 题目链接题目描述解题思路代码实现总结 题目链接 链接: AcWing 802. 区间和 题目描述 解题思路 离散化是一种常用的技巧&#xff0c;它能够将原始的连续数值转换为一组离散的值&#xff0c;从而简化问题的处理。在这段代码中&#xff0c;离散化的过程主要分为三个步…

[C/C++] -- CMake使用

CMake&#xff08;Cross-platform Make&#xff09;是一个开源的跨平台构建工具&#xff0c;用于自动生成用于不同操作系统和编译器的构建脚本。它可以简化项目的构建过程&#xff0c;使得开发人员能够更方便地管理代码、依赖项和构建设置。 CMake 使用一个名为 CMakeLists.tx…

sheng的学习笔记-docker部署数据库oracle,mysql

部署目录&#xff1a;sheng的学习笔记-部署-目录-CSDN博客 docker基础知识可参考 sheng的学习笔记-docker部署&#xff0c;原理图&#xff0c;命令&#xff0c;用idea设置docker docker安装数据库 mac版本 安装oracle 下载oracle镜像 打开终端&#xff0c;输入 docker s…

【开源】JAVA+Vue.js实现高校学院网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学院院系模块2.2 竞赛报名模块2.3 教育教学模块2.4 招生就业模块2.5 实时信息模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学院院系表3.2.2 竞赛报名表3.2.3 教育教学表3.2.4 招生就业表3.2.5 实时信息表 四、系…