腾讯面试中的TCP/IP协议简述+经典面试题
gudong366 2025-07-28 16:46 5 浏览
面试题有福利
TCP/IP协议简述+
TCP握手协议
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
SYN:同步序列编号(Synchronize Sequence Numbers)
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
A与B建立TCP连接时:首先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,这样TCP的一次连接(三次握手)的过程就建立了!
一、TCP报文格式
TCP/IP协议的详细信息参看《TCP/IP协议详解》三卷本。下面是TCP报文格式图:
图1 TCP报文格式
上图中有几个字段需要重点介绍下:
(1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
需要注意的是:
(A)不要将确认序号Ack与标志位中的ACK搞混了。
(B)确认方Ack=发起方Req+1,两端配对。
二、三次握手
所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:
图2 TCP三次握手
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
SYN攻击:
在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
#netstat -nap | grep SYN_RECV
三、四次挥手
三次握手耳熟能详,四次挥手估计就,所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:
图3 TCP四次挥手
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:
图4 同时挥手
流程和状态在上图中已经很明了了,在此不再赘述,可以参考前面的四次挥手解析步骤。
四、附注
关于三次握手与四次挥手通常都会有典型的面试题,在此提出供有需求的XDJM们参考:
(1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。
(2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
经典面试题 需要资料的后台私信资料MF送
1. OSI与TCP/IP各层的结构与功能,都有哪些协议。
(1)OSI:七层模型。
①物理层:在物理信道上实现原始比特流的传输。(以太网, IEEE 802.2 等)
②数据链路层:实现无差错地将数据帧从一个节点传送到下一个相邻节点。(Wi-Fi(IEEE 802.11) , WiMAX(IEEE 802.16), GPRS, HDLC, PPP 等协议)
③网络层:实现将数据分组从源站通过网络传送到目的站,即网络上一台主机与另一台主机之间的数据传输。(IP, ICMP, IGMP, ARP, RARP, OSPF 等协议)
④传输层:实现源端到目的端数据的传输,即某主机的某进程与另一台主机的某进程之间的数据传输。(TCP, UDP 等协议)
⑤会话层:实现在不同机器上用户建立、维护和终止会话关系。即会话层对会话提供控制管理服务、会话同步服务等。(ZIP, ASP, SSH 等协议)
⑥表示层:确保各种通信设备能够互相操作,不及考虑其数据的内部表示。即确保即使各种通信设备其数据的内部表示不同,但仍然能相互正确操作。(SSL等协议)
⑦应用层:使用户能够访问网络,为各类应用提供相应的服务、提供各种用户接口支持服务。应用层不是应用程序,应用层是一个为应用程序提供各类应用支持的服务层。(HTTP, FTP, SMTP, POP3, DHCP, DNS等协议)
(2)TCP/IP:四层模型。
①网络接口层:对应物理层和数据链路层。
②网络层
③传输层
④应用层:包括会话层、表示层、应用层。
2. TCP与UDP的区别。
(1)TCP:面向连接,可靠的,速度慢,效率低。
(2)UDP:无连接、不可靠、速度快、效率高。
当进程需要传输可靠的数据时应使用TCP,当进程需要高效传输数据,可以忽略可靠性时应使用UDP协议。
3. TCP报文结构
4. TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。
TimeWait作用:
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于CLOSED 状态 ,就会响应rst 而不是ack。所以
主动方要处于TIME_WAIT 状态,而不能是CLOSED 。
TIME_WAIT 并不会占用很大资源的,除非受到攻击。
还有,如果一方send 或recv 超时,就会直接进入CLOSED 状态
5. TCP拥塞控制。
(1)在通信子网出现过多数据包的情况,使得网络的性能下降,甚至不能正常工作,这种现象就称为拥塞。
(2)网络拥塞的成因主要有三:1、处理器的速度太慢。2、线路容量的限制。3、节点输出包的能力小于输入包的能力。
(3)拥塞控制与流量控制是相关的,流量控制在数据链路层对一条通信路径上的流量进行控制,其的是保证发送者的发送速度不超过接收者的接收速度,它只涉及一全发送者和一个接收者,是局部控制。拥塞控制是对整个通信子网的流量进行控制,其目的是保证通信子网中的流量与其资源相匹配,使子网不会出现性能下降和恶化、甚至崩溃,是全局控制。
(4)拥塞控制的最终目标是:1、防止由于过载而使吞吐量下降,损失效率;2、合理分配网络资源;3、避免死锁;4、匹配传输速度。
(5)对拥塞控制,可用的方法有两类:开环控制和闭环控制。
1、开环控制的思想是通过良好的设计避免拥塞问题的出现,确保拥塞问题在开始时就不可能发生。开环控制方法包括何时接受新的通信何时丢弃包、丢弃哪些包。其特点是在作出决定时不考虑网络当前的状态。
2、闭环控制的思想是反馈控制。即通过将网络工作的动态信息反馈给网络中节点的有关进程,节点根据网络当前的动态信息,调整转发数据包的策略。闭环控制过程包括三部分: ①监视系统 检测网络发生或将要发生拥塞的时间和地点。②报告 将监视中检测到的信息传送到可以进行拥塞控制的节点。③决策 调整系统的操作行为,以解决问题。
(6)对应于开环控制的方法有:(基于拥塞预防)
1、预定缓冲区 2、合理分配缓冲区 3、通信量整形法(A、许可证算法,B、漏桶算法,C、令牌漏桶算法。)
对应于闭环控制的方法有:(基于拥塞抑制,即拥塞出现或即将出现时采取适当的措施进行控制,直到消除拥塞)
1、阻塞包法。 2、负载丢弃法
6. TCP滑动窗口与回退N针协议。
(2)go-back-N:为了提高信道的利用率和传输的效率,在未收到确认信息时允许发送方连续发送N帧数据,收方的缓冲区只能存放一帧数据。当接收方检测出出错的信息帧后,要求发送方重发最后一个正确接收的信息帧之后的所有未被确认的帧;或者当发送方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧。因为对接收方来说,由于这一帧出错,就不能以正常的序号向它的高层递交数据,对其后发送来的N帧也可能都不能接收而丢弃。GO-BACK-N可能将已正确传送到目的地的数据帧再重传一遍,这显然是一种浪费。为了不出现二义性发方的窗口大小不得大于2n-1。
7. Http的报文结构。
(1)HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
(2)HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。
8. Http的状态码含义。
常见的如下:
200 请求已完成 2XX状态码均为正常状态码返回。
401 未授权 请求要求进行身份验证。登录后,服务器可能会对页面返回此响应。
403 已禁止 服务器拒绝请求。
404 未找到 服务器找不到请求的网页。例如,如果请求是针对服务器上不存在的网页进行的,那么,服务器通常会返回此代码。
415 不支持的媒体类型 请求的格式不受请求页面的支持。
500 服务器内部错误 服务器遇到错误,无法完成请求。
9. Http request的几种类型。
10. Http1.1和Http1.0的区别
11. Http怎么处理长连接。
12. Cookie与Session的作用于原理。
13. 电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。
14. Ping的整个过程。ICMP报文是什么。
15. C/S模式下使用socket通信,几个关键函数。
16. IP地址分类。
17. 路由器与交换机区别
相关推荐
- 怎么利用Python实现一个远程监控多台Linux主机资源的管理工具
-
摘要:这款基于Python和Flask设计的监控软件,主要是为了实现多主机Linux系统资源监控的目的,支持对本机及远程主机的资源进行监控。不但能定时收集包括CPU、内存、磁盘、IO和网络在内的关键数...
- Linux 流量监控怎么玩?5 个工具 + 3 个维度,保姆级教程来了
-
在数字化运维场景中,Linux服务器因其稳定性和开放性,成为承载核心应用与网络管理的主流平台。而高效监控网络流量,不仅是保障系统性能的关键,更是抵御安全威胁的第一道防线。本文将系统拆解Linux...
- Linux系统监控工具,你知道几个?(linux监控平台有哪些)
-
常用的Linux系统监控工具,可帮助您监视系统性能、资源利用率和进程活动等方面的信息:top:top是一个命令行工具,用于实时监视系统的进程活动和系统资源使用情况。它提供了CPU、内存、磁盘和网络等方...
- Linux服务器上监控网络带宽的18个常用命令和工具
-
一、如何查看CentOS的网络带宽出口检查维护系统的时候,经常会要查看服务器的网络端口是多大的,所以需要用到Linux的一个命令。如何查看CentOS的网络带宽出口多大?可以用下面的命令来查看。#e...
- 查看MySQL所有数据库列表(mysql怎样查看数据库)
-
请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1.前言本文主要讲解如何在Linux系统上查看MySQL所有数据库列表。在管理MySQL...
- Linux系统中的who命令你真的会用吗?
-
请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1.前言本教程主要介绍如何使用who命令检查用户登录信息。Linux中的who命令列出了...
- Linux系统中,查看CPU信息的多样方法
-
一、命令行工具(适合所有Linux发行版)1.lscpu命令功能:显示CPU架构、核心数、线程数、缓存、NUMA节点等详细信息。使用:bashlscpu示例输出:Architecture:x86_...
- Linux系统 用户信息的显示:users、w、who
-
前言在Linux系统中,当我们需要查看登入系统的用户相关信息的时候,可以通过如下三条命令来查看:【users|w|who】。本文来具体学习一下这三条命令。目录一、命令描述二、命令常用选项三...
- Linux 用户、用户组、文件权限、文件查找
-
3-linux用户、用户组、文件权限、文件查找概述在Linux操作系统中,用户与权限管理是系统安全和稳定运行的核心环节。Linux是典型的多用户操作系统,每个使用系统的人都需要拥有独立的用...
- 使用linux中.ssh/config配置客户端host
-
~/.ssh/config文件是一个很有用的文件,它用于配置客户端的参数在~/.ssh/config中可以定义ssh的参数,这个文件在当前用户的目录下面,即该配置只能被当前用户使用,其他用户使用不了!...
- 「技术干货」Ip头udp数据包ARP协议(代码实现netmap)
-
协议栈数据组成格式用户层:用户数据传输层:8个字节udp头+用户层网络层:20个字节的ip头+传输层链路层:14个字节的以太网头+网络层网卡(在链路层和物理层之间):将链路层数据经过DA转换,...
- uboot常用命令汇总(uboot详解)
-
我们经常使用uboot命令,虽然资料光盘->常见问题目录有U-boot常用命令汇总文档,但从大家的反馈来看,并没有很多人注意到这个文档,所以把它挪到这里。如此全的uboot命令汇总,建议收藏。注...
- 腾讯面试中的TCP/IP协议简述+经典面试题
-
面试题有福利TCP/IP协议简述+TCP握手协议在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入...
- socket连接数受端口号的限制?谬论
-
初学网络的同学对socket可能会有误解:服务器能接受的最大连接数跟端口的个数65536有关系!为什么会有这样的误会?服务器端的程序无非是这样的:socket();//创建sock...
- 研究发现近期零日IP漏洞激增,被利用攻击 Mac 和 Linux 计算机
-
据pcmag网8月8日报道,据悉,使用0.0.0.0IP地址的零日漏洞近几个月来出现激增,并被黑客利用,可能使MacOS或Linux上Safari、Chrome和Firefox等...
- 一周热门
- 最近发表
- 标签列表
-
- linux一键安装 (31)
- linux运行java (33)
- ln linux (27)
- linux 磁盘管理 (31)
- linux 内核升级 (30)
- linux 运行python (28)
- linux 备份文件 (30)
- linux 网络测试 (30)
- linux 网关配置 (31)
- linux jre (32)
- linux 杀毒软件 (32)
- linux语法 (33)
- linux博客 (33)
- linux 压缩目录 (37)
- linux 查看任务 (32)
- 制作linux启动u盘 (35)
- linux 查看存储 (29)
- linux乌班图 (31)
- linux挂载镜像 (31)
- linux 软件源 (28)
- linux题目 (30)
- linux 定时脚本 (30)
- linux 网站搭建 (28)
- linux 远程控制 (34)
- linux bind (31)