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

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 就会表现出
更大的优势。我客户端只需要发送,服务端能不能接收的到我不管
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值