美文网首页网络
第八周:网络协议及管理配置

第八周:网络协议及管理配置

作者: 还没帮马里奥再闯一关 | 来源:发表于2021-01-22 22:47 被阅读0次

    1、简述osi七层模型和TCP/IP五层模型

    认识协议

    “协议”是一种约定。
    计算机之间传输媒介是光信号和电信号,通过“频率“和”“强弱”来表示0、1这样的信息,想要传递不同的信息,需要约定好双方的数据格式。
    网络协议是一个共同标准,大家都来遵守。
    为了让两台主机通信,需要协议和标准的数据格式才能进行通信。

    协议分层(分层最大的好处就是便于封装

    OSI七层模型:

    OSI七层网络模型称为开发式系统互联网参考模型,是一个逻辑上的定义和规范;把网络从逻辑上分为七层,每一层都有相应的物理设备;OSI七层网络模型是一种框架式的设计方法,最主要的功能就是帮助不同类型的主机实现数据传输;最大的优点就是将服务、接口和协议三个概念明确的区分起来;复杂且不实用;经常使用的是TCP/IP四层模型。

    各部分及功能:

    1. 应用层:针对你特定应用的协议
    2. 表示层:设备固定的数据格式和网络标准数据格式之间的转化
    3. 会话层:通信管理,负责建立和单开通信连接,管理传输层 以下分层
    4. 传输层:管理两个节点之间的数据传递。负责可靠传输
    5. 网络层:地址管理和路由选择
    6. 数据链路层:互联设备之间传送和识别数据帧
    7. 物理层:界定连接器和网线之间的规格
    TCP/IP四(五)层模型。

    每一层都呼叫它的下一层提供的网络来完成自己的需求。(如果是四层模型数据链路层和物理层在一层)

    1. 物理层:负责光电信号传递方式。集线器工作在物理层。以太网协议。
    2. 数据链路层:负责设备之间的数据帧的传输和识别。交换机工作在数据链路层。例如网卡设备的驱动,帧同步,冲突检测,数据差错校验等工作。
    3. 网络层:负责地址管理和路由选择。路由器工作在网络层。
    4. 传输层:负责两台主机之间的数据传输。
    5. 应用层:负责应用程序之间的沟通。网络编程主要针对的就是应用层。
    • 传输层和网络层的封装在操作系统完成。应用层的封装在应用程序中完成。
      数据链路层和物理层的封装在设备驱动程序与网络接口中完成。


      20180827235215579(1).png

    关系


    20180827235251899(1).png
    • 一般而言: 对于一台主机,它的操作系统内核实现了传输层到物理层的内容
    • 对于一台路由器,它实现了从网络层到物理层
    • 对于一台交换机,它实现了由数据链路层到物理层
    • 对于集线器,他只实现了物理层。
    TCP/IP与OSI模型的区别
    • 相同点

      两者都是以协议栈的概念为基础

      协议栈中的协议彼此相互独立、

      下层为上层提供服务

    • 不同点

      OSI先有模型;TCP/IP先有协议,后有模型

      OSI是国际标准,适用于各种协议栈;TCP/IP只适用TCP/IP网络中

      两者的层次数量不同

    参考:https://blog.csdn.net/ffsiwei/article/details/82121010,侵删。

    2、总结描述TCP三次握手四次挥手

    写在前面:

    个人认为如果要必须先要理解为什么分层,每一层对应什么协议,每一层实现的功能,才能更好的去答这道题

    首先分层就是为了更好的封装和解封装数据,数据自上而下进行传输时,从前往后依次被附加了以太网包首部、IP包首部、TCP包首部(或UDP包首部)以及应用自己的包首和数据。而包的最后则被添加了以太网包尾。

    每个包首部中至少包含两个信息:一个是发送端和接收端地址,另一个是上一层的协议类型。

    经过每个协议分层时,都必须有识别包发送端和接收端的信息。以太网会用MAC地址,IP会用IP地址,而TCP/IP则会用端口号作为识别两端主机的地址。

    而TCP是传输层对应的协议,三次握手和四次挥手对应的就是一个连接从建立到断开的过程,因此此处要分析一下TCP包头的结构


    20180717201939345(1).jpg
    • 源端口、目标端口:计算机上的进程要和其它进程通信是要通过计算机端口的,而计算机的一个端口某一时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个,即65536个端口。
    • 序列号(seq):表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按照编号排序,由于序号由32位字节表示,所以没2^32个字节,就会出现序号回绕,再次从0开始。
    • 确认号(ack):表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送数据的第一个字节数据的编号为此确认号。
    • 数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长,它指出TCP报文段的数据起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节。
    • URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
    • ACK确认:表示是否前面确认号(ack)字段是否有效。只有当ACK=1时,前面的确认ACK=1时,前面的确认号ack才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段。
    • PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中。
    • RST:如果收到1个RST=1的报文,说明与主机的连接出现了严重的错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的报文段又被称为复位报文段。
    • SYN:在建立连接时使用,用来同步序号,当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前面两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
    • FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕了,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段。
    • 窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由window size value*window size scaling factor(此值在三次握手阶段TCP选项window scale协商得到)得出此值
    • 校验和:提供额外的可靠性
    • 紧急指针:标记紧急数据在数据字段中的位置
    • 选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节。

    了解了以上的TCP报文结构,就可以来解释这道题目中的建立连接时3次握手和释放连接4次挥手的过程了。

    首先

    3次握手的过程:

    20180717202520531.png
    • 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态(同步已发送),等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)
    • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1)即服务器希望客户端随后发送x+1这个序号的数据包,同时服务器也发送一个SYN包(syn=y),即SYN+ACK包,,此时服务器进入SYN_RECV状态(同步收到);
    • 第三次握手:客户端收到服务器发送的SYN+ACK包,知道自己可以发送下一个包了,于是向服务器发送ACK确认包(ack=y+1),表示服务器可以发送下一段报文seq=y+1的包了,这个包发送完毕后,客户端和服务器就都进入ESTABLISHED(TCP连接成功)状态,完成三次握手,开始数据传送。

    关于理解TCP数据报文中的序号SEQ和确认号ACK

    此时A主机向B主机发送SEQ=100的包
    B主机收到A主机发来的SEQ=100的包,回应A主机ACK=101,表明A主机发送的第100个包收到了,同时B主机向A主机发送自己SEQ=1000的包
    A主机收到B主机发来的ACK=101,SEQ=1000的包,就理解了B已经收到了刚刚SEQ=100的包了,可以发送SEQ=101的包了,
    同时A主机也要回应B主机ACK=1001,SEQ=101,表明自己已经收到了B主机的SEQ=1000的包了,B主机可以发送下一个包了,同时将自己SEQ=101的包发送
    B主机收到A主机发来的ACK=1001,SEQ=101,就理解了A已经收到了刚刚SEQ=1000的包了,可以发送SEQ=1002的包了,
    同时B主机也要回应A主机ACK=102,SEQ=1002,表明自己已经收到了A主机的SEQ=101的包了,A主机可以发送下一个包了,同时将自己SEQ=1002的包发送
    

    4次挥手(TCP释放连接时)

    48540923dd54564e5260495ce0006487d0584fb6.jpeg
    • 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序列号+1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文即使不携带数据,也要消耗一个序号。
    • 服务器收到连接释放报文,发出确认ACK=1,确认号ack=u+1,并且带上字节的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是若服务器发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT(关闭等待)状态持续的时间。
    • 客户端收到服务器的确认请求后,此时客户端就进入了FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
    • 服务器将最后的数据发送完毕后,就向客户端发送FIN=1,ack=u+1,由于在半关闭状态,服务器很可能发送了一些数据,假定此时的序列号为seq=w,此时服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
    • 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号时seq=u+1,此时客户端就进入了TIME-WAIT(时间等待)状态。注意,此时TCP连接还没有释放,必须经过2倍的MSL(最长报文段寿命,查阅资料MSL一般为2秒,2倍的MSL即4秒)的时间后,当客户端撤销相应的TCP后,才进入CLOSED状态(连接关闭)。
    • 服务器只要收到了客户端发出的确认,立即进入CLOSED状态(连接关闭),同样撤销TCP后,就结束了此次TCP连接,可以看到,服务器结束TCP的连接要比客户端早一些,因为客户端要等待2倍的MSL时间。

    当然,光理解了TCP的3次握手和4次挥手在面试时显然是不够的,我们要考虑到灵魂追问的场景。

    (本人多年以前学网络的时候也是对于三次握手稀里糊涂的,知道多年以后重新温习三次握手的时候,才真正明白了为什么说TCP连接时可靠的,就是因为三次握手必须要双方都要确认对方收到了自己的确认,其中参考了某位大佬的博文https://blog.csdn.net/qq_38950316/article/details/81087809,这里其实也说明如果有些知识当时不懂,可以先暂时放一放,给脑子一个缓冲的时间,回头再来翻一翻,理解TCP报文背后的结构的每一个字段是什么意思,在结合图例可能就看懂了)

    【问题1】为什么连接的时候时3次握手,而关闭连接的时候需要4次挥手呢?

    答:
    因为当Server收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK的报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是当关闭连接时,当Server端收到FIN(关闭连接)报文时,很可能并不会立即关闭SOCKET(套接字,是各自通信连接中的端点,是一个抽象概念,套接字上联应用程序进程,下联网络协议簇,是应用程序与网络协议交互的接口,因此套接字是由IP地址和端口结合的,例如192.168.1.1:23,一个TCP连接应该包含两个套接字,即Server端和Client端的),所以只能先回复一个ACK报文,告诉Client端:“你发送的FIN报文我收到了”。只有等到我Server段的数据都发送完了,我才能发送FIN报文给你,因此不能一起发送。所以需要4次挥手。

    【问题2】为什么TIME_WAIT状态需要2倍的MSL(最大报文段生存寿命)才能进入CLOSED状态?

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

    【问题3】为什么不能进行2次握手?

    答:
    3次握手的重要性就在与双方都要做好数据发送的准备工作(即双方都知道彼此已经准备好了),也要允许双方就初始seq序列号进行一个协商,才知道自己该从什么顺序开始发送报文,这个seq在握手的过程中被发送和确认。

    我们假设3次握手改成了2次握手,死循环的可能性是会发生的。作为例子,考虑计算机S与C之间的通信,假定C给S发送了一个连接请SYN(请求连接)报文,S收到了这个报文,并发送了确认ACK,按照两次握手的协定,S认为TCP连接已经建立了,可以开始发送数据了,可是,S发送给C的确认ACK和序列号在传输中丢失了,那么C将不知道S是否已经准备好了,也不知道S建立了什么样的序列号,甚至怀疑S是否收到了自己的SYN(请求连接)报文,在这种情况下,C认为TCP连接还没有建立成功,那么将忽略S发来的认为数据,专门只等待S的确认ACK和序列号。而S发现自己发出的数据没有回应,那么将不断的重传相同的数据,这样就形成了一个死循环。
    综上,3次握手时为了确认双方都已经做好了建立连接的准备,并且已经协商好了彼此的初始序列号(即报文的第一个字节的顺序)。

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

    答:
    TCP还设有一个保活计时器,显然,客户端如果发生了故障,服务器不能一直等待下去,这样会白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是2个小时,如果2个小时还没有收到客户端的任何数据,服务器就会发送一个探测报文,以后每隔75秒就会发送一次,若一连发送10个探测报文对方都没有反应,服务器就认为客户端出现了故障,接着就关闭连接。

    3、描述TCP和UDP区别
    参考:https://blog.csdn.net/weixin_33858249/article/details/91731668

    tcp是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来。使用TCP协议传输数据,TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。当数据从A端传到B端后,B端会发送一个确认包(ACK包)给A端,告知A端数据我已收到!

    UDP协议就没有这种确认机制,这就是为什么说TCP协议可靠,UDP协议不可靠,提供这种可靠服务,会加大网络带宽的开销,因为“虚拟信道”是持续存在的,同时网络中还会出现大量的ACK和FIN包。TCP协议提供了可靠的数据传输,但是其拥塞控制、数据校验、重传机制的网络开销很大,不适合实时通信,所以选择开销很小的UDP协议来传输数据。UDP协议是无连接的数据传输协议并且无重传机制,会发生丢包、收到重复包、乱序等情况。
    1.基于连接与无连接。
    2.UDP不提供可靠性,不能保证数据能够到达目的地。
    3.对系统资源的要求(TCP较多,UDP少)。
    4.UDP结构较简单。
    5.TCP面向字节流模式,TCP会保证服务端按顺序接收到全部的字节流,UDP面向数据报模式,不保证顺序性。

    很明显,当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时,选择TCP协议。当强调传输性能而不是传输的完整性时,如音频和多媒体应用,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择,如DNS交换。UDP较低的开销使其有更好的机会去传送管理数据。TCP丰富的功能有时会导致不可预料的性能低下。

    相关文章

      网友评论

        本文标题:第八周:网络协议及管理配置

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