美文网首页前端面试题
TCP/IP三次握手四次挥手常见面试题

TCP/IP三次握手四次挥手常见面试题

作者: 阿昊v | 来源:发表于2019-04-07 15:54 被阅读20次

    常见面试题

    【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

    答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

    【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

    答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

    【问题3】为什么不能用两次握手进行连接?

    答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

          现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

    【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?

    答:TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收

    TCP/IP协议的工作流程如下:

    ●在源主机上,应用层将一串应用数据流传送给传输层。

    ●传输层将应用层的数据流截成分组,并加上TCP报头形成TCP段,送交网络层。

    ●在网络层给TCP段加上包括源、目的主机IP地址的IP报头,生成一个IP数据包,并将IP数据包送交链路层。

    ●链路层在其MAC帧的数据部分装上IP数据包,再加上源、目的主机的MAC地址和帧头,并根据其目的MAC地址,将MAC帧发往目的主机或IP路由器。

    ●在目的主机,链路层将MAC帧的帧头去掉,并将IP数据包送交网络层。

    ●网络层检查IP报头,如果报头中校验和与计算结果不一致,则丢弃该IP数据包;若校验和与计算结果一致,则去掉IP报头,将TCP段送交传输层。

    ●传输层检查顺序号,判断是否是正确的TCP分组,然后检查TCP报头数据。若正确,则向源主机发确认信息;若不正确或丢包,则向源主机要求重发信息。

    ●在目的主机,传输层去掉TCP报头,将排好顺序的分组组成应用数据流送给应用程序。这样目的主机接收到的来自源主机的字节流,就像是直接接收来自源主机的字节流一样。

    1、建立连接协议(三次握手)

    (1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。

    (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。

    (3) 客户必须再次回应服务段一个ACK报文,这是报文段3。

    2、连接终止协议(四次挥手)

      由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

     (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。

     (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

     (3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。

     (4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

    CLOSED:这个没什么好说的了,表示初始状态。

    LISTEN:这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。

    SYN_RCVD:这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。

    SYN_SENT:这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。

    ESTABLISHED:这个容易理解了,表示连接已经建立了。

    FIN_WAIT_1:这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。

    FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。

    TIME_WAIT:表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

    CLOSING:这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

    CLOSE_WAIT:这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。

    LAST_ACK:这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。

    最后有2个问题的回答,我自己分析后的结论(不一定保证100%正确)

    1、 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

    这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

    2、 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

    这是因为:虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。 

    一、Http的报文结构。

    (1)HTTP请求报文

    一个HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成,下图是请求报文的一般格式。

    (2)HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。

    二、TCP与UDP的区别。

    (1)TCP:面向连接,可靠的,速度慢,效率低。

    (2)UDP:无连接、不可靠、速度快、效率高。

    当进程需要传输可靠的数据时应使用TCP,当进程需要高效传输数据,可以忽略可靠性时应使用UDP协议。

    三、TCP/IP:四层模型。

    ①网络接口层:对应物理层和数据链路层。

    ②网络层

    ③传输层

    ④应用层:包括会话层、表示层、应用层。

    四、HTTP与HTTPS有什么区别?

    HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。

    简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

    HTTPS和HTTP的区别主要如下:

    1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

    2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

    3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

    4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    五、Ping,ICMP报文是什么。

    PING (Packet Internet Groper),因特网包探索器,用于测试网络连通性的程序。

    Ping发送一个ICMP(Internet Control Messages Protocol,因特网信报控制协议);回声请求消息给目的地并报告是否收到所希望的ICMPecho (ICMP回声应答)。

    工作原理:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。

    为了提高IP数据报交付成功机会,在网络层使用过了网际控制报文协议(ICMP)来允许主机或路由器报告差错和异常情况。ICMP报文作为IP层数据报的数据,加上数据报首部,组成IP数据报发出去。ICMP协议是IP层协议。

    六、http1.0与http1.1的区别

    1、HTTP 1.0中浏览器与服务器只保持短暂的连接,浏览器的每次请求都与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。

    2、http1.1提供永久性连接(即1.0使用非持久连接,HTTP1.0没有host的字段).

    3、HTTP 1.1中增加Host请求头字段后,实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。

    4、http1.1提供身份认证(HTTP1.1提供一个基于口令的基本认证方式,)

    七、解释一下tcp三次握手四次挥手(对于有网络协议工程师之类笔试,几乎是必考的内容)

    TCP三次握手

      所谓三次握手,是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

      三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

      (1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

      (2) 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

      (3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

    完成三次握手,客户端与服务器开始传送数据。

    TCP四次挥手

      TCP的连接的拆除需要发送四个包,因此称为四次挥手。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

      TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

    (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。

    (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

    (3) 服务器关闭客户端的连接,发送一个FIN给客户端。

    (4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1

    1.序列号seq

    占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生,给字节编上序号后,就给每一个报文段指派一个序号,序列号seq就是这个报文段中的第一个字节的数据编号。

    2.确认号ack

    占4个字节,期待收到对方下一个报文段的第一个数据字节的序号,序列号表示报文段携带数据的第一个字节的编号,而确认号指的是期望接受到下一个字节的编号,因此挡墙报文段最后一个字节的编号+1即是确认号。

    3.确认ACK

    占1个比特位,仅当ACK=1,确认号字段才有效。ACK=0,确认号无效。

    4.同步SYN

    连接建立时用于同步序号。当SYN=1,ACK=0表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使用SYN=1,ACK=1.因此,SYN=1表示这是一个连接请求,或连接接收报文,SYN这个标志位只有在TCP建立连接才会被置为1,握手完成后SYN标志位被置为0.

    5.终止FIN

    用来释放一个

    SYN攻击

      在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.

    Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

    Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击

    netstat -n -p TCP | grep SYN_RECV

    一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.

    但是不能完全防范syn攻击。

    tcp/ip代表什么

    利用IP进行通信时所必须用到的协议群的统称

    RFC协议的说明,STD 管理

    RFC

    互联网结构

    互联网由很多较小范围的网络组成,每个小网由骨干网和末端网组成

    TCP/IP协议分层模型

    物理层将二进制的0和1和电压高低,光的闪灭和电波的强弱信号进行转换

    链路层代表驱动

    网络层

    使用IP协议,IP 协议基于 IP 转发分包数据

    IP协议是个不可靠协议,不会重发

    IP协议发送失败会使用ICMP 协议通知失败

    ARP解析 IP 中的 MAC 地址,MAC 地址由网卡出厂提供

    IP还隐含链路层的功能,不管双方底层的链路层是啥,都能通信

    传输层

    通用的TCP和 UDP 协议

    TCP协议面向有连接,能正确处理丢包,传输顺序错乱的问题,但是为了建立与断开连接,需要至少7次的发包收包,资源浪费

    UDP面向无连接,不管对方有没有收到,如果要得到通知,需要通过应用层

    会话层以上分层

    TCP/IP分层中,会话层,表示层,应用层集中在一起

    网络管理通过SNMP协议

    TCP/IP分层模型与通信示例

    发包过程

    表示层转码,会话层决定何时建立连接,传输层负责建立连接,断开连接和发送数据,保证数据能顺利发送至对端。TCP

    协议(传输层)在数据前附加一个首部,这个首部除了包含发送端和接收端地址以外,还包含序号,检验和(判断数据是否被破坏)。IP

    (网络层)模块将TCP传来的首部和数据当数据。加首部,这个首部中包含地址和上一层的协议。链路层除了添加首部,还会添加 FCS 到包尾

    收包过程

    链路层判断MAC地址,判断IP

    协议。网络层做的事情差不多,在这里,对于有路由器的情况下,借助路由控制表,在找到应该送达的主句或路由器以后再转发数据。传输层检验数据是否被损坏,检验数据是否按照顺序发送,然后再做相同的事情

    数据链路层

    数据链路的作用

    链路层将数据集合为一个帧的块,然后进行传输

    只提供导线一端到另一端的传输

    MAC地址

    Mac地址长48比特,被烧入到网卡 ROM 中,不会重复

    交换机

    交换机自学然后生成一张Mac表,具体原理为

    交换机4个端口连接着终端,A 终端与端口1连接,发送 frame 后交换机得知端口1和 A

    终端的关系,然后转发到其他三端,转发完成后得知端口2与主机 B 想对应,记录到表中。以后主机 A 与主机 B

    的通信就通过端口1和端口2进行

    帧frame

    帧是“一个数据链路层的传输单元,由一个数据链路层首部和其携带的分组所组成”。譬如说以太网帧,PPP 帧

    相关文章

      网友评论

        本文标题:TCP/IP三次握手四次挥手常见面试题

        本文链接:https://www.haomeiwen.com/subject/liysiqtx.html