首页 > 编程语言 >TCP,UDP,Socket,Http网络编程面试题 47道

TCP,UDP,Socket,Http网络编程面试题 47道

时间:2024-08-21 11:25:16浏览次数:9  
标签:面试题 Http IP UDP TCP 服务器 连接 客户端

1. 什么是网络编程          1.网络编程的本质是多台计算机之间的数据交换。数据传递本身没有多大的难度,不就是把一个设备 中的数据发送给其他设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请 求/ 响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。在网络 编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client) ,等待其他程序连 接的程序被称作服务器(Server) 。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应 连接,则需要一直启动。 2.例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。 连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。在一 些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是QQ 、微信这类软件了。 2.网络编程中两个主要的问题 1. 一个是如何准确的定位网络上一台或多台主机, 2. 另一个就是找到主机后如何可靠高效的进行数据传输。 在 TCP/IP 协议中 IP 层主要负责网络主机的定位,数据传输的路由,由 IP 地址可以唯一地确定 Internet 上的一台主机。 而 TCP 层则提供面向应用的可靠( TCP )的或非可靠( UDP )的数据传输机制,这是网络编程的主 要对象,一般不需要关心 IP 层是如何处理数据的。 目前较为流行的网络编程模型是客户机 / 服务器( C/S )结构。即通信双方一方作为服务器等待客户 提出请求并予以响应。客户则在需要服务时向服务器提 出申请。服务器一般作为守护进程始终运 行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服 务端口,使后来的客户也 能及时得到服务。 3.网络协议是什么 在计算机网络要做到井井有条的交换数据,就必须遵守一些事先约定好的规则,比如交换数据的格 式、是否需要发送一个应答信息。这些规则被称为网络协议。 为什么要对网络协议分层 简化问题难度和复杂度。由于各层之间独立,我们可以分割大问题为小问题。 灵活性好。当其中一层的技术变化时,只要层间接口关系保持不变,其他层不受影响。 易于实现和维护。 促进标准化工作。分开后,每层功能可以相对简单地被描述 计算机网络体系结构 OSI 参考模型 OSI ( Open System Interconnect ),即开放式系统互联。一般都叫 OSI 参考模型,是 ISO (国际标准化组织)组织在 1985 年研究的网络互连模型。 ISO 为了更好的使网络应用更为 普及,推出了 OSI 参考模型,这样所有的公司都按照统一的标准来指定自己的网络,就可以互 通互联了。 OSI 定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、 应用层)。 TCP/IP 参考模型 TCP/IP 四层协议(数据链路层、网络层、传输层、应用层) 1. 应用层 应用层最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网 络服务。我们常见应用层的网络服务协议有: HTTP , HTTPS , FTP , TELNET 等。 2. 传输层 建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数 据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细 节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定 的、可靠的数据通路。我们通常说的, TCP UDP 就是在这一层。端口号既是这里的 “ 端 ” 。 3. 网络层 本层通过 IP 寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适 的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的 IP 层。这一 层就是我们经常说的 IP 协议层。 IP 协议是 Internet 的基础。 4. 数据链路层 通过一些规程或协议来控制这些数据的传输,以保证被传输数据的正确性。实现 这些规程或协议的 硬件 和软件加到物理线路,这样就构成了数据链路, TCP / UDP 1.1 什么是 TCP/IP UDP TCP/IP 即传输控制 / 网络协议,是面向连接的协议,发送数据前要先建立连接 ( 发送方和接收方的成 对的两个之间必须建 立连接 ) , TCP 提供可靠的服务,也就是说,通过 TCP 连接传输的数据不会丢 失,没有重复,并且按顺序到达 UDP 它是属于 TCP/IP 协议族中的一种。是无连接的协议,发送数据前不需要建立连接,是没有可 靠性的协议。因为不需要建立连接所以可以在在网络上以任何可能的路径传输,因此能否到达目的 地,到达目的地的时间以及内容的正确性都是不能被保证的。 1.2 TCP UDP 区别: TCP 是面向连接的协议,发送数据前要先建立连接, TCP 提供可靠的服务,也就是说,通过 TCP 连 接传输的数据不会丢失,没有重复,并且按顺序到达; UDP 是无连接的协议,发送数据前不需要建立连接,是没有可靠性; TCP 通信类似于于要打个电话,接通了,确认身份后,才开始进行通行; UDP 通信类似于学校广播,靠着广播播报直接进行通信。 TCP 只支持点对点通信, UDP 支持一对一、一对多、多对一、多对多; TCP 是面向字节流的, UDP 是面向报文的; 面向字节流是指发送数据时以字节为单位,一个数据 包可以拆分成若干组进行发送,而 UDP 一个报文只能一次发完。 TCP 首部开销( 20 字节)比 UDP 首部开销( 8 字节)要大 UDP 的主机不需要维持复杂的连接状态表 1.3 TCP UDP 的应用场景: 对某些实时性要求比较高的情况使用 UDP ,比如游戏,媒体通信,实时直播,即使出现传输错误 也可以容忍;其它大部分情况下, HTTP 都是用 TCP ,因为要求传输的内容可靠,不出现丢失的情 况 1.4 形容一下 TCP UDP TCP 通信可看作打电话: 李三 ( 拨了个号码 ) :喂,是王五吗? 王五:哎,您谁啊? 李三:我是李三,我想给你说点事儿, 你现在方便吗? 王五:哦,我现在方便,你说吧。 甲:那我说了啊? 乙:你说吧。 ( 连接建立 了,接下来就是说正事了 …) UDP 通信可看为学校里的广播: 播音室:喂喂喂!全体操场集合 1.5 运行在 TCP UDP 的应用层协议分析。 运行在 TCP 协议上的协议: HTTP ( Hypertext Transfer Protocol ,超文本传输协议),主要用于普通浏览。 HTTPS ( HTTP over SSL ,安全超文本传输协议) ,HTTP 协议的安全版本。 FTP ( File Transfer Protocol ,文件传输协议),用于文件传输。 POP3 ( Post Office Protocol, version 3 ,邮局协议),收邮件用。 SMTP ( Simple Mail Transfer Protocol ,简单邮件传输协议),用来发送电子邮件。 TELNET ( Teletype over the Network ,网络电传),通过一个终端( terminal )登陆到网 络。 SSH ( Secure Shell ,用于替代安全性差的 TELNET ),用于加密安全登陆用。 运行在 UDP 协议上的协议: BOOTP ( Boot Protocol ,启动协议),应用于无盘设备。 NTP ( Network Time Protocol ,网络时间协议),用于网络同步。 DHCP ( Dynamic Host Configuration Protocol ,动态主机配置协议),动态配置 IP 地址。 运行在 TCP 和 UDP 协议上: DNS ( Domain Name Service ,域名服务),用于完成地址查找,邮件转发等工作。 ECHO ( Echo Protocol ,回绕协议),用于查错及测量应答时间(运行在 TCP 和 UDP 协议 上)。 SNMP ( Simple Network Management Protocol ,简单网络管理协议),用于网络信息的 收集和网络管理。 DHCP ( Dynamic Host Configuration Protocol ,动态主机配置协议),动态配置 IP 地址。 ARP ( Address Resolution Protocol ,地址解析协议),用于动态解析以太网硬件的地址。 什么是 ARP 协议 (Address Resolution Protocol) ARP 协议完成了 IP 地址与物理地址的映射 。每一个主机都设有一个 ARP 高速缓存,里面有 所在的 局域网 上的各主机和路由器的 IP 地址到硬件地址的映射表。当源主机要发送数据包到目的主机 时,会先检查自己的 ARP 高速缓存中有没有目的主机的 MAC 地址,如果有,就直接将数据包发到这 个 MAC 地址,如果没有,就向 所在的局域网 发起一个 ARP 请求的广播包(在发送自己的 ARP 请求 时,同时会带上自己的 IP 地址到硬件地址的映射),收到请求的主机检查自己的 IP 地址和目的主 机的 IP 地址是否一致,如果一致,则先保存源主机的映射到自己的 ARP 缓存,然后给源主机发送一 个 ARP 响应数据包。源主机收到响应数据包之后,先添加目的主机的 IP 地址与 MAC 地址的映射,再 进行数据传送。如果源主机一直没有收到响应,表示 ARP 查询失败。 如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的 某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。 剩下的工作就由下一个网络来做。 什么是 NAT (Network Address Translation, 网络地址转换 ) 用于解决内网中的主机要和因特网上的主机通信。由 NAT 路由器将主机的本地 IP 地址转换为全球 IP 地址,分为静态转换(转换得到的全球 IP 地址固定不变)和动态 NAT 转换。 从输入址到获得页面的过程 ? 1. 浏览器查询 DNS ,获取域名对应的 IP 地址 : 具体过程包括浏览器搜索自身的 DNS 缓存、搜索操作系 统的 DNS 缓存、读取本地的 Host 文件和向本地 DNS 服务器进行查询等。对于向本地 DNS 服务器进 行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析 ( 此解析具有权威性 ) ;如果要查询的域名不由本地 DNS 服务器区域解析,但该服务器已缓存了此网 址映射关系,则调用这个 IP 地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务 器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询; 2. 浏览器获得域名对应的 IP 地址以后,浏览器向服务器请求建立链接,发起三次握手; 3. TCP/IP 链接建立起来后,浏览器向服务器发送 HTTP 请求; 4. 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应 的视图返回给浏览器; 5. 浏览器解析并渲染视图,若遇到对 js 文件、 css 文件及图片等静态资源的引用,则重复上述步骤并 向服务器请求这些资源; 6. 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。 1.6 TCP 的三次握手 1.6.1 什么是 TCP 的三次握手 在网络数据传输中,传输层协议 TCP 是要建立连接的可靠传输, TCP 建立连接的过程,我们称为三 次握手。 1.6.2 三次握手的具体细节 1. 第一次握手: Client 将 SYN 置 1 ,随机产生一个初始序列号 seq 发送给 Server ,进入 SYN_SENT 状 态; 2. 第二次握手: Server 收到 Client 的 SYN=1 之后,知道客户端请求建立连接,将自己的 SYN 置 1 , ACK 置 1 ,产生一个 acknowledge number=sequence number+1 ,并随机产生一个自己的初始序列 号,发送给客户端;进入 SYN_RCVD 状态; 3. 第三次握手:客户端检查 acknowledge number 是否为序列号 +1 , ACK 是否为 1 ,检查正确之后将 自己的 ACK 置为 1 ,产生一个 acknowledge number= 服务器发的序列号 +1 ,发送给服务器;进入 ESTABLISHED 状态;服务器检查 ACK 为 1 和 acknowledge number 为序列号 +1 之后,也进入 ESTABLISHED 状态;完成三次握手,连接建立。 简单来说就是 : 1. 客户端向服务端发送 SYN 2. 服务端返回 SYN,ACK 3. 客户端发送 ACK 1.6.3 用现实理解三次握手的具体细节 三次握手的目的是建立可靠的通信信道,主要的目的就是双方确认自己与对方的发送与接收机能正 常。 1. 第一次握手:客户什么都不能确认;服务器确认了对方发送正常 2. 第二次握手:客户确认了:自己发送、接收正常,对方发送、接收正常;服务器确认 了:自己接 收正常,对方发送正常 3. 第三次握手:客户确认了:自己发送、接收正常,对方发送、接收正常;服务器确认 了:自己发 送、接收正常,对方发送接收正常 所以三次握手就能确认双发收发功能都正常,缺一不可。 1.6.4 建立连接可以两次握手吗?为什么 ? 不可以。 因为可能会出现已失效的连接请求报文段又传到了服务器端。 > client 发出的第一个连接请求报文 段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server 。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为 是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设 不采用 “ 三次握手 ” ,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出 建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新 的运输连接已经建立,并一直等待 client 发来数据。这样, server 的很多资源就白白浪费掉了。 采用 “ 三次握手 ” 的办法可以防止上述现象发生。例如刚才那种情况, client 不会向 server 的确认 发出确认。 server 由于收不到确认,就知道 client 并没有要求建立连接。 而且,两次握手无法保证 Client 正确接收第二次握手的报文( Server 无法确认 Client 是否收到), 也无法保证 Client 和 Server 之间成功互换初始序列号。 1.6.5 可以采用四次握手吗?为什么? 这个肯定可以。三次握手都可以保证连接成功了,何况是四次,但是会降低传输的效率。 1.6.6 第三次握手中,如果客户端的 ACK 未送达服务器,会怎样? Server 端:由于 Server 没有收到 ACK 确认,因此会每隔 3 秒 重发之前的 SYN+ACK (默认重发五 次,之后自动关闭连接进入 CLOSED 状态), Client 收到后会重新传 ACK 给 Server 。 Client 端,会出现两种情况: 1. 在 Server 进行超时重发的过程中,如果 Client 向服务器发送数据,数据头部的 ACK 是为 1 的, 所以服务器收到数据之后会读取 ACK number ,进入 establish 状态 2. 在 Server 进入 CLOSED 状态之后,如果 Client 向服务器发送数据,服务器会以 RST 包应答。 1.6.7 如果已经建立了连接,但客户端出现了故障怎么办? 服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为 2 小时,若两小时 还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔 75 秒钟发送一次。若 一连发送 10 个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。 1.6.8 初始序列号是什么? TCP 连接的一方 A ,随机选择一个 32 位的序列号( Sequence Number )作为发送数据的初始序列 号( Initial Sequence Number , ISN ),比如为 1000 ,以该序列号为原点,对要传送的数据进行 编号: 1001 、 1002... 三次握手时,把这个初始序列号传送给另一方 B ,以便在传输数据时, B 可以 确认什么样的数据编号是合法的;同时在进行数据传输时, A 还可以确认 B 收到的每一个字节,如 果 A 收到了 B 的确认编号( acknowledge number )是 2001 ,就说明编号为 1001-2000 的数据已经 被 B 成功接受。 1.7 TCP 的四次挥手 1.7.1 什么是 TCP 的四次挥手 在网络数据传输中,传输层协议断开连接的过程我们称为四次挥手 1.7.2 四次挥手的具体细节 1. 第一次挥手: Client 将 FIN 置为 1 ,发送一个序列号 seq 给 Server ;进入 FIN_WAIT_1 状态; 2. 第二次挥手: Server 收到 FIN 之后,发送一个 ACK=1 , acknowledge number= 收到的序列号 +1 ; 进入 CLOSE_WAIT 状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。 3. 第三次挥手: Server 将 FIN 置 1 ,发送一个序列号给 Client ;进入 LAST_ACK 状态; 4. 第四次挥手: Client 收到服务器的 FIN 后,进入 TIME_WAIT 状态;接着将 ACK 置 1 ,发送一个 acknowledge number= 序列号 +1 给服务器;服务器收到后,确认 acknowledge number 后,变为 CLOSED 状态,不再向客户端发送数据。客户端等待 2*MSL (报文段最长寿命)时间后,也进入 CLOSED 状态。完成四次挥手。 1.7.3 用现实理解三次握手的具体细节 TCP 的四次挥手 四次挥手断开连接是因为要确定数据全部传书完了 1. 客户与服务器交谈结束之后,客户要结束此次会话,就会对服务器说:我要关闭连接了(第一 次 挥手) 2. 服务器收到客户的消息后说:好的,你要关闭连接了。(第二次挥手) 3. 然后服务器确定了没有话要和客户说了,服务器就会对客户说,我要关闭连接了。 ( 第三次挥 手 ) 4. 客户收到服务器要结束连接的消息后说:已收到你要关闭连接的消息。 ( 第四次挥手 ) ,才关闭 1.7.4 为什么不能把服务器发送的 ACK FIN 合并起来,变成三次挥手( CLOSE_WAIT 状态意义是什 么)? 因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK ,表示接 收到了断开连接的请求。等到数据发完之后再发 FIN ,断开服务器到客户端的数据传送。 1.7.5 如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样? 客户端没有收到 ACK 确认,会重新发送 FIN 请求。 1.7.6 客户端 TIME_WAIT 状态的意义是什么? 第四次挥手时,客户端发送给服务器的 ACK 有可能丢失, TIME_WAIT 状态就是用来重发可能丢失的 ACK 报文。如果 Server 没有收到 ACK ,就会重发 FIN ,如果 Client 在 2*MSL 的时间内收到了 FIN ,就 会重新发送 ACK 并再次等待 2MSL ,防止 Server 没有收到 ACK 而不断重发 FIN 。 MSL(Maximum Segment Lifetime) ,指一个片段在网络中最大的存活时间, 2MSL 就是一个发送和一个回复所需的 最大时间。如果直到 2MSL , Client 都没有再次收到 FIN ,那么 Client 推断 ACK 已经被成功接收,则 结束 TCP 连接。 2 Socket 1 什么是 Socket 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个 Socket 。 Socket 通常用来实现客户方和服务方的连接。 Socket 是 TCP/IP 协议的一个十分流行的编 程界面,一个 Socket 由一个 IP 地址和一个端口号唯一确定。 但是, Socket 所支持的协议种类也不光 TCP/IP 、 UDP ,因此两者之间是没有必然联系的。在 Java 环 境下, Socket 编程主要是指基于 TCP/IP 协议的网络编程。 socket 连接就是所谓的长连接,客户端和服务器需要互相连接,理论上客户端和服务器端一旦建立 起连接将不会主动断掉的,但是有时候网络波动还是有可能的 Socket 偏向于底层。一般很少直接使用 Socket 来编程,框架底层使用 Socket 比较多, 2 socket 属于网络的那个层面 3 Socket 通讯的过程 基于 TCP :服务器端先初始化 Socket ,然后与端口绑定 (bind) ,对端口进行监听 (listen) ,调用 accept 阻塞,等待客户端连接。在这时如果有个客户端初始化一个 Socket ,然后连接服务器 (connect) ,如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务 器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次 交互结束。 基于 UDP : UDP 协议是用户数据报协议的简称,也用于网络数据的传输。虽然 UDP 协议是一种不 太可靠的协议,但有时在需要较快地接收数据并且可以忍受较小错误的情况下, UDP 就会表现出 更大的优势。我客户端只需要发送,服务端能不能接收的到我不管

标签:面试题,Http,IP,UDP,TCP,服务器,连接,客户端
From: https://blog.csdn.net/dd4595415519/article/details/141388368

相关文章

  • ArkTS---http数据请求
    前言:    要使用http请求,需在module.json5文件中添加网络管理权限"module":{"requestPermissions":[{"name":"ohos.permission.INTERNET"}]}一、使用步骤    1、导入http模块        HTTP数据请求功能主要由http模块......
  • 小学智慧教育平台(网址:https://basic.smartedu.cn
    信息科技教学指南及配套课件,可在国家中小学智慧教育平台免费使用  导读:日前,教育部发布关于印发《2024年义务教育国家课程教学用书目录(根据2022年版课程标准修订)》的通知,根据2022年版义务教育课程标准修订的教材将于2024年秋季学期陆续投入使用。 注:以下附文件全文及......
  • PHP8.1新增的异步HTTP客户端
    php8.1新增的异步http客户端随着互联网的快速发展,各种Web应用程序的性能也变得越来越重要。为了提供更好的用户体验,开发人员需要使用高效的工具和技术来处理各种网络请求。幸运的是,PHP8.1引入了一个全新的功能,即异步HTTP客户端,它允许我们以非阻塞的方式执行HTTP请求,从而提高应用......
  • android开发将charles证书安装到安卓系统根目录实现https抓包
    android开发将charles证书安装到安卓系统根目录实现https抓包1.安装charles,然后先将charles证书到电脑端下载地址:https://www.charlesproxy.com/安装证书到电脑端先:点击Help->SSLProxying->InstallCharlesRootCertificate->安装证书...->本地计算机->下一步......
  • Java面试题--JVM大厂篇之未来已来:为什么ZGC是大规模Java应用的终极武器?
           ......
  • BT5 2011.3.漏洞发现.2(http smb)
    第三部分HTTP工具 1.BurpSuite(1)BurpSuiteisacombinationofpowerfulwebapplicationsecuritytools.Thesetoolsdemonstratethereal-worldcapabilitiesofanattackerpenetratingthewebapplications.Itcanscan,analyze,andexploitthewebapplications......
  • springboot自动配置原理-面试题
    网络上看很多文章并没什么用,重点没说到,不知道从那里入手讲,刷到的直接按照下面这个,背出来就行了1、当启动springboot应用程序的时候,会先创建SpringApplication的对象,在对象的构造方法中会进行某些参数的初始化工作,最主要的是判断当前应用程序的类型以及初始化器和监听器,在这个......
  • udp协议
    发送端packagecom.shujia.day20.udpdemo2;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.util.Scanner;/*1:建立udp的socket服务2:将要发送的数据封装成数据包3:通过udp的socket服务,将数据包......
  • Java笔试面试题AI答之线程(2)
    文章目录7.如何确保N个线程可以访问N个资源同时又不导致死锁?1.资源排序与顺序访问2.资源分配策略3.避免占用并等待4.引入超时机制5.死锁检测与解决6.使用高级并发工具7.编程实践8.Java方法可以同时即是static又是synchronized的吗?9.什么是Java多线程同步?10......
  • Leetcode面试经典面试题-81.搜索旋转排序数组II
    解法都在代码里,不懂就留言或者私信,这个题目一定要注意重复元素的情况shpublicstaticbooleansearch(int[]nums,inttarget){/**空数组不可能找到任何数*/if(nums==null||nums.length==0){returnfalse;}/**如果......