网络编程面试题 · TCP 与 UDP 协议
1 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,地址解析协议),用于动态解析以太网硬件的地址。
1.6 什么是ARP协议 (Address Resolution Protocol)?
ARP协议完成了IP地址与物理地址的映射。每一个主机都设有一个 ARP 高速缓存,里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。当源主机要发送数据包到目的主机时,会先检查自己的ARP高速缓存中有没有目的主机的MAC地址,如果有,就直接将数据包发到这个MAC地址,如果没有,就向所在的局域网发起一个ARP请求的广播包(在发送自己的 ARP 请求时,同时会带上自己的 IP 地址到硬件地址的映射),收到请求的主机检查自己的IP地址和目的主机的IP地址是否一致,如果一致,则先保存源主机的映射到自己的ARP缓存,然后给源主机发送一个ARP响应数据包。源主机收到响应数据包之后,先添加目的主机的IP地址与MAC地址的映射,再进行数据传送。如果源主机一直没有收到响应,表示ARP查询失败。
如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。
1.7 什么是NAT (Network Address Translation, 网络地址转换)?
用于解决内网中的主机要和因特网上的主机通信。由NAT路由器将主机的本地IP地址转换为全球IP地址,分为静态转换(转换得到的全球IP地址固定不变)和动态NAT转换。
1.8 从输入址到获得页面的过程?
1、 浏览器查询DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系;统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
2、 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
3、 TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
4、 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应;的视图返回给浏览器;
5、 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并;向服务器请求这些资源;
6、 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面;
1.9 TCP的三次握手
1.9.1 什么是TCP的三次握手
- 在网络数据传输中,传输层协议TCP是要建立连接的可靠传输,TCP建立连接的过程,我们称为三次握手。
1.9.2 三次握手的具体细节
![ ][nbsp 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、 第三次握手:客户端检查acknowledgenumber是否为序列号+1,ACK是否为1,检查正确之后将;自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1,发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1之后,也进入ESTABLISHED状态;完成三次握手,连接建立。
- 简单来说就是 :
1、 客户端向服务端发送SYN;
2、 服务端返回SYN,ACK;
3、 客户端发送ACK;
1.9.3 用现实理解三次握手的具体细节
- 三次握手的目的是建立可靠的通信信道,主要的目的就是双方确认自己与对方的发送与接收机能正常。
1、 第一次握手:客户什么都不能确认;服务器确认了对方发送正常;
2、 第二次握手:客户确认了:自己发送、接收正常,对方发送、接收正常;服务器确认了:自己接;收正常,对方发送正常
3、 第三次握手:客户确认了:自己发送、接收正常,对方发送、接收正常;服务器确认了:自己发;送、接收正常,对方发送接收正常 所以三次握手就能确认双发收发功能都正常,缺一不可。
1.9.4 建立连接可以两次握手吗?为什么?
- 不可以。
- 因为可能会出现已失效的连接请求报文段又传到了服务器端。 > client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。
- 而且,两次握手无法保证Client正确接收第二次握手的报文(Server无法确认Client是否收到),也无法保证Client和Server之间成功互换初始序列号。
1.9.5 可以采用四次握手吗?为什么?
这个肯定可以。三次握手都可以保证连接成功了,何况是四次,但是会降低传输的效率。
1.9.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.9.7 如果已经建立了连接,但客户端出现了故障怎么办?
- 服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
1.9.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.10 TCP的四次挥手
1.10.1 什么是TCP的四次挥手
- 在网络数据传输中,传输层协议断开连接的过程我们称为四次挥手
1.10.2 四次挥手的具体细节
![ ][nbsp 3]
1、 第一次挥手:Client将FIN置为1,发送一个序列号seq给Server;进入FIN_WAIT_1状态;
2、 第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledgenumber=收到的序列号+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.10.3 用现实理解三次握手的具体细节TCP的四次挥手
- 四次挥手断开连接是因为要确定数据全部传书完了
1、 客户与服务器交谈结束之后,客户要结束此次会话,就会对服务器说:我要关闭连接了(第一次;挥手)
2、 服务器收到客户的消息后说:好的,你要关闭连接了(第二次挥手);
3、 然后服务器确定了没有话要和客户说了,服务器就会对客户说,我要关闭连接了(第三次挥手);
4、 客户收到服务器要结束连接的消息后说:已收到你要关闭连接的消息(第四次挥手),才关闭;
1.10.4 为什么不能把服务器发送的ACK和FIN合并起来,变成三次挥手(CLOSE_WAIT状态意义是什么)?
- 因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复ACK,表示接收到了断开连接的请求。等到数据发完之后再发FIN,断开服务器到客户端的数据传送。
1.10.5 如果第二次挥手时服务器的ACK没有送达客户端,会怎样?
- 客户端没有收到ACK确认,会重新发送FIN请求。
1.10.6 客户端TIME_WAIT状态的意义是什么?
- 第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。 MSL(MaximumSegment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。