Java面试:第2章 计算机网络面试核心

2-1 网络基础知识详解

OSI 参考模型(Open System Interconnect 开放系统互连参考模型)

在这里插入图片描述在这里插入图片描述

  1. 物理层【原始比特流的传输】【网卡】
  • 定义了物理设备的标准,如网线类型、光纤接口类型、各种传输介质的传输速率等
  • 主要作用为比特流的传输,将01机器码转化为强弱电流传输,到达目的地后在转换为机器码(即数模、模数转换)
  1. 数据链路层【将比特数据转化为帧】【交换机】
  • 在传输比特流时会发生错传、数据传输不完整的可能,此层定义了如何格式化数据以进行传输以及如何对控制对物理介质的访问,将比特数据组合为帧,并提供错误检测及纠正以保证数据传输的可靠性。
  • 交换机的作用是对帧解码,并根据帧中包含的信息将数据发送到对应的接收方。
  1. 网络层【将网络地址翻译为对应的物理地址,并决定如何将数据由发送方路由到接收方,点对点】【路由器】
  • IP协议
  • 根据发送优先权、网络拥塞程度、服务质量及可选路由的花费,选择网络中节点A到节点B的最优路径
  • 为数据包选择路由,寻址
  1. 传输层【提供端对端的接口,主机间的数据传输】
  • TCP(传输控制协议)、UDP协议(用户数据协议)
  • 流量控制、分割数据包、对数据片(即分割后的数据包)安排序列号以便接收方按顺序重组
  1. 会话层【建立、管理应用程序之间的通讯】
  • 应用程序自动收发包和寻址
  1. 表示层【数据编码、数据压缩格式和加密技术】
  • 对应用层数据编码和数据格式转换,解决不同系统之间的通讯问题
  1. 应用层【用户接口】
  • HTTP协议
  • 文件传输、电子邮件、远程操作

OSI七层模型小结 :
由于OSI是一个理想的模型,因此一般网络系统只涉及其中的几层,很少有系统能够具有所有的7层,并完全遵循它的规定。在7层模型中,每一层都提供一个特殊的网络功能。
从网络功能的角度观察:下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主;第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;而上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。

一个很容易理解OSI 七层模型的例子:

OSI七层模式简单通俗理解:这个模型推出的最开始,是因为美国人有两台机器之间进行通信的需求。

  • 需求1:
    科学家要解决的第一个问题是,两个硬件之间怎么通信。具体就是一台发些比特流,然后另一台能收到。
    于是,科学家发明了物理层:
    主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

  • 需求2:
    现在通过电线我能发数据流了,但是,我还希望通过无线电波,通过其它介质来传输。然后我还要保证传输过去的比特流是正确的,要有纠错功能。
    于是,发明了数据链路层:
    通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。

  • 需求3:
    现在我可以在两台计算机之间发送数据了,那么如果我要在多台计算机之间发送数据呢?怎么找到我要发的那台?或者,A要给F发信息,中间要经过B,C,D,E,但是中间还有好多节点如K.J.Z.Y。我怎么选择最佳路径?这就是路由要做的事。
    于是,发明了网络层。
    通过路由算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与物理层之间的信息转发,建立、维持与终止网络的连接。具体的说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。一般的,数据链路层是解决统一网络内节点之间的通信,而网络层主要解决不同子网之间的通信。例如路由选择问题。

  • 需求4:
    现在我能发正确的发比特流数据到另一台计算机了,但是当我发大量数据时候,可能需要好长时间,例如一个视频格式的,网络会中断好多次(事实上,即使有了物理层和数据链路层,网络还是经常中断,只是中断的时间是毫秒级别的)。那么,我还须要保证传输大量文件时的准确性。于是,我要对发出去的数据进行封装。就像发快递一样,一个个地发。
    于是,先发明了传输层。
    向用户提供可靠的、端到端的差错和流量控制,保证报文的正确传输。提供建立、连接和拆除传输连接的功能。传输层在网络层基础上,提供“面向连接”和“面向无连接”两种服务。例如TCP,是用于发大量数据的,我发了1万个包出去,另一台电脑就要告诉我是否接受到了1万个包,如果缺了3个包,就告诉我是第1001,234,8888个包丢了,那我再发一次。这样,就能保证对方把这个视频完整接收了。
    例如UDP,是用于发送少量数据的。我发20个包出去,一般不会丢包,所以,我不管你收到多少个。在多人互动游戏,也经常用UDP协议,因为一般都是简单的信息,而且有广播的需求。如果用TCP,效率就很低,因为它会不停地告诉主机我收到了20个包,或者我收到了18个包,再发我两个!如果同时有1万台计算机都这样做,那么用TCP反而会降低效率,还不如用UDP,主机发出去就算了,丢几个包你就卡一下,算了,下次再发包你再更新。

  • 需求5:
    现在我们已经保证给正确的计算机,发送正确的封装过后的信息了。但是用户级别的体验好不好?难道我每次都要调用TCP去打包,然后调用IP协议去找路由,自己去发?当然不行,所以我们要建立一个自动收发包,自动寻址的功能。
    于是,发明了会话层。
    会话层的作用就是建立和管理应用程序之间的通信。允许用户在两个实体设备之间建立、维持和终止会话,并支持它们之间的数据交换。例如提供单方向会话或双向同时会话,并管理会话中的发送顺序,以及会话所占用时间的长短。

  • 需求6:
    现在我能保证应用程序自动收发包和寻址了。但是我要用Linux给window发包,两个系统语法不一致,就像安装包一样,exe是不能在linux下用的,shell在window下也是不能直接运行的。
    于是需要表示层,帮我们解决不同系统之间的通信语法问题。

  • 需求7:
    OK,现在所有必要条件都准备好了,我们可以写个android程序,web程序去实现需求把。

TCP/IP四层模型(OSI的"实现")

在这里插入图片描述在这里插入图片描述

  1. 链路层(数据链路层,物理层)(数据链路层/网络接口层):
    包括操作系统中的设备驱动程序、计算机中对应的网络接口卡
  2. 传输层
    主要为两台主机上的应用提供端到端的通信。
  3. 网络层(网络互联层):
    处理分组在网络中的活动,比如分组的选路。
  4. 应用层(应用层、表示层、会话层)
    负责处理特定的应用程序细节。

网络层与运输层的区别:

在TCP/TP协议族中,
网络层IP提供的是一种不可靠的服务。它只是尽可能快地把分组从源节点送到目的节点,但不提供任何可靠性的保证。
TCP在不可靠的IP层上,提供了一个可靠的运输层,为了提供这种可靠的服务,TCP采用了超时重传、发送和接受端到端的确认分组等机制。

TCP/IP四层模型与OSI七层模型的对应关系

TCP/IP与OSI最大的不同在于OSI是一个理论上的网络通信模型,而TCP/IP则是实际运行的网络协议。

参考:
TCP/IP协议群
TCP/IP 四层模型与 OSI 参考模型
应用系统之间数据传输的四种方式

2-2 TCP的三次握手

传输控制协议TCP简介

  • 面向连接的、可靠的、基于字节流的传输层通信协议

  • 将应用层的数据流分割成报文段并发送给目标节点的TCP层
    报文段长度通常受该计算机连接网络的数据链路层的最大传输单元及MPU限制,之后TCP把结果包传给IP层

  • 数据包都有序号,对方收到则发送ACK确认,未收到则重传
    数据包有序号的原因就是为了保证包不丢失,序列号(Sequence Number),也保证了传送到目标节点包的按序处理。然后接收端实体对已成功收到的包发回一个相应的确认,即ACK确认。如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包会被认为已丢失,并且将会对其进行重传。

  • 使用校验和未校验数据在传输过程中是否有误
    TCP用奇偶校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和

TCP报文头

在这里插入图片描述在这里插入图片描述在这里插入图片描述

TCP报文是TCP层传输的数据单元,也叫报文段。

1.端口号(PID):用来标识同一台计算机的不同的应用进程。

  • 源端口:源端口和IP地址的作用是标识报文的返回地址。
  • 目的端口:端口指明接收方计算机上的应用程序接口。
    TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

IP地址+协议+端口号去标识网路中的一个进程,这种唯一标识称为套接字socakt

2. 序号(Sequence Number)和确认号(Acknowledgment
Number
)
:是TCP可靠传输的关键部分。
序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。
一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。
确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。
例如:B收到A发送的报文,其序列号字段是301,数据长度是200字节,这表明B正确收到了A发送到序号501(301+200-1)为止的数据,因此B期待收到A的下一个数据序号是501,B再发送给A的报文段中会把ACK确认号置为501。
确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。

  1. 数据偏移(Offset)/首部长度()
    4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。

  2. 控制位(TCP Flags)
    由8个标志位来组成,每个标志位表示一个控制的功能,其中常见的包括:

  • URG: 紧急指针标志。1-紧急指针有效,0-忽略紧急指针
  • ACK: 确认序号标志。1-确认序号有效,0-报文中不含确认信息,忽略确认号字段
  • PSH: push标志。1-表有push的标志,指示接收方在接收到报文段以后,应尽快将报文段交给应用程序,而不是在缓冲区排队
  • RST: 重置连接标志。用于重置由于主机崩溃或者其他原因而出现错误的连接,或者用于拒绝非法的报文端和拒绝连接请求
  • SYN: 同步序号,用于建立连接过程。在连接请求中SYN=1, ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1, ACK=1
  • FIN: finsh标志,用于释放连接。唯一时表示发送方没有数据发送,即关闭本方数据流,
  1. 窗口(Window)
    滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小是一个16bit字段,因而窗口大小最大为65535。

  2. 校验和(Checksum)
    奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。

  3. 紧急指针(Urgent Pointer)
    只有当 URG 标志为1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

  4. 选项和填充
    最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。

  5. 数据部分
    TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

三次握手

当应用程序希望通过TCP与另一个应用通信时,它会发送一个通信请求,这个请求必须被送到一个确切的地址,在双方握手之后,TCP将在两个应用之间建立一个全双通的通信,这个全双通(A可以给B发送信息的同时,B也能够给A发信息)的通信将占用两个计算机之间的通信线路,直到被一方,或者双方关闭为止。

“握手”是为了建立连接,TCP三次握手的流程图如下:

在这里插入图片描述在这里插入图片描述
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:

客户端和服务器端刚开始为Close状态,建立连接时,客户端发送SYN包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认(服务器进入LISEN状态);
PS:
这个报文(SYN包)不能携带数据,需要消耗一个序号;
初始序号seq =x ,x可以是任意的正整数值。

第二次握手:

服务器收到SYN包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
PS:
这个报文也不能携带数据,需要消耗一个序号;
第一次握手SYN报文中指定了seq=x,服务端要回应相关的信息,并且第一次握手中报文消耗了一个序号,因此ack=x+1;
为自己的缓存初始化一个序列号,即seq=y。

第三次握手:

客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTAB_LISHED状态,完成三次握手。
PS:
这个报文段可以携带数据,也可以不携带数据,不携带数据就不会消耗序号;
服务器给客户端发送一个seq=y,客户端作为回应,需要加1,因此ack=y+1;
第二次握手的报文会消耗一个序号,第一次握手的时候,客户端告知(ack)服务器序号被+1了,即seq =x , 因此第三次握手时候seq = x+ 1。

完成三次握手之后,双方就可以开始通信了。

为什么需要三次握手才能建立起连接

为了初始化Sequence Number的初始值

首次握手的隐患 – SYN超时

问题起因分析

  • Server收到Client的SYN,恢复SYN-ACK的时候未收到ACK确认
    此时这个连接处于中间状态,没有成功也没有失败

  • Server不断充实直至超时,linux默认等待63秒才断开连接
    Server在一定时间内没有收到Client的回值,就会重发SYN-ACK,linux下默认重发次数为5次,重发的时间间隔从1开始,依次翻倍;1+2+4+8+31并等待32秒,才能够判断为超时,TCP才会断开连接。
    这可能会使得服务器遭到SYN Flood攻击的风险,恶意程序会给服务器发送SYN报文,发送之后就下线了,于是服务器需要默认等待63秒才能断开连接,这样攻击者就可以把服务器SYN连接的队列耗尽,让正常的连接请求不能处理。

针对SYN Flood的防护措施

  • SYN队列满后,通过tcp_syncookies参数回发SYN Cookie

  • 若为正常连接则Clinet会回发SYN Cookie,直接建立连接

建立连接后,Client出现故障怎么办

计算机网络

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值