Linux网络-IP协议详解
零、前言本章主要讲解学习网络层的作用, 深入理解IP协议的基本原理一、网络层概念及介绍:在网络体系中,每一层都是服务于对应的上下层的,网络层也是服务于上层的传输层和下层的数据链路层网络层介于传输层和数据链路层之间,其主要作用是实现两个不同网络系统之间的数据透明传送,具体包括路由选择,拥塞控制和网际互连等(注:负责不同的网络之间(基于数据包的IP地址)尽力转发数据包,不负责丢包重传和接收顺序)网络层在数据从数据链路层向传输层进行数据传输的通信中,起到构建一个中间通信子网的作用。不同网络有不同的网络层协议和地址规范,不同网络有不同的设计规范,属于不同的组织来管理,必须通过授权,并由专门的协议来负责网络间的通信如果只是同一局域网内的各个计算机之间的通信,单靠物理层和数据链路层就可以建立通信链路完成用户间的数据通信,但要扩大应用范围,连接不同的局域子网,就需要借助网络层处理各个网络子网的协议,从而进行计算机的网络互连,所以网络层在 TCP/IP 协议体系中叫网际互连层网络层的主要作用:屏蔽网络差异,提供透明传输网络层就是为了解决不同网络有不同的规范要求的差异问题,寻找一个不同网络间都能共同遵守的网络通信规范,以便不同网络间能相互识别,并接受对方的网络请求。也就是一个中转站的作用,两个毫无交集的网络通过这个中转站来建立交集为网络间通信提供路由选择路由选择是根据一定的原则和路由选择算法在多个结点的通信子网中选择一条到达目的节点的最佳路径的过程。确定路由选择的策略称为路由算法。在无连接的数据包服务中,网络节点要为每个数据包做出路由选择,即选择到达目的节点的最佳路线,而在面向连接的虚电路服务中,存在一条专门的逻辑线路,在建立连接时就已经确定了路有路径,无需额外选择拥塞控制拥塞控制是为了避免网络传输路径中数据的传输延迟或死锁。数据链路层中的流量控制功能,是针对数据链路中点对点传输速率的控制,这里的拥塞控制是针对在网络层传输路径中的端到端传输效率的控制。主要采用预约缓冲区、许可证和分组丢弃等方式理解路由选择示图:说明:通常一个计算机网络就是一个管理边界,一般是属于一个特定的公司,有一个特定的管理者负责,所以在进行计算机网络互连时,要同时考虑两方面的问题:一是授权用户可以在不同网络间互访,共享双方的资源;另一方面又要保持各计算机网络管理原来的独立性而不同用户之间进行通信,首先得知道彼此的地址,局域网内部的用户访问(物理层和数据链路层就可以构建一个局域网)是通过MAC地址进行,但不同网络之间进行访问需要网络层对应的一个网络地址来进行访问,每个网络都通过其网络地址即NSAP(网络服务访问点)来标识,网络中的每个节点都有一个NSAP。这个NSAP就是由对应网络所运行的网络层通信协议来定义的,在目前最常见的TCP/IP协议网络中,这个协议就是IP协议,对应的NSAP就是IP地址在数据链路层中传输的是一个个以许多字节为单位的帧,在每个帧的帧头都有源节点的MAC地址和目的节点的MAC地址,局域网内部的寻址就是通过MAC地址进行的,而在网络层中传输的是数据报(Packet,也叫分组),一个数据报是一个数据帧经过网络层协议重封装后得到的,每个数据报的报头(IP头)都有源节点和目的节点的IP地址,网路间的寻址就是通过IP地址进行的即网络通信只有两种情况:如果通信双方在同一个局域网内,可直接通过数据链路层进行相互通信,但因为主机其实也有网络层的路由功能,所以两台主机间进行网络通信时通常也是通过三层来进行的(IP协议则是IP地址寻址);如果通信双方在不同网络内,需要网络层中的网络地址进行寻址,即必须通过三层进行二、IP协议基本概念:主机: 配有IP地址, 但是不进行路由控制的设备路由器: 即配有IP地址, 又能进行路由控制节点: 主机和路由器的统称协议头格式:说明:4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是44位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节(表示范围20-60,注报头固定字段为20字节)8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个(注:对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要)16位总长度(total length): IP数据报整体占多少个字节(IP报文最大为64KB)16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0. 类似于一个结束标记13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环8位协议: 表示上层协议的类型16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏32位源地址和32位目标地址: 表示发送端和接收端选项字段: 不定长, 最多40字节IP报头与有效载荷分离:当IP从底层获取到一个报文后,首先读取报文的前20个字节,并从中提取出4位的首部长度获得IP报头的大小(基本报头字段+选项字段)首部长度之后就是有效载荷,再读取16位总长度,获得整个报文的大小,减去报头大小就是有效载荷的大小了IP确定向上交付的协议层:当IP从底层获取到一个报文后,提取8位协议从而知道应该将分离出来的有效载荷交付给上层的哪一个协议的32位源IP地址和32位目的IP地址:IP报头当中的32位源IP地址和32位目的IP地址,分别代表的就是该报文的发送端和接收端对应的IP地址数据在不同网络传输的过程中会通过很多的路由器(连接不同网段),路由器具有网络层,会提取IP报头当中的目的IP地址,通过与路由表进行IP对比从而选择下一跳的网段,也就实现数据路由转发当接收端收到了发送端发来的数据后,接收端可能也想要给发送端发送数据(或者进行应答),因此发送端在发送数据时除了需要指明该数据的目的IP地址,还需要指明该数据的源IP地址,也就是发送端的IP地址最大传输单元MTU:MAC帧作为数据链路层的协议,它会将IP传下来的数据封装成数据帧,然后发送到网络当中。但MAC帧携带的有效载荷的最大长度是有限制的,也就是说IP交给MAC帧的报文不能超过某个值,这个值就叫做最大传输单元(Maximum Transmission Unit,MTU),这个值的大小一般是1500字节由于MAC帧无法发送大于1500字节的数据,因此IP层向下交付的数据的长度不能超过1500字节(IP的报头和有效载荷),如果超过了1500字节,那么就需要先在IP层对该数据进行分片,然后再将分片后的数据交给下层MAC帧进行发送分片和组装:如果发送数据时在IP层进行了分片,那么当这些分片数据到达对端主机的IP层后就需要先进行组装,然后再将组装好的数据交付给上层传输层实际在网络通信过程中不分片才是常态,因为数据分片会存在一些潜在的问题,比如分片可能会增加丢包的概率数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中的路由器也可能对数据进行分片,因为不同网络的MTU是不一样的分片和组装原理:对于分片后的多个报文,每一个报文的报头中的16位标识都是相同的,标识主机发送的同一个报文同时在3位标志中的第三位“更多分片”字段中,最后一个分片报文设置为0以外(表示在这分片之后没有分片了),其余分片报文均设置为1(表示在这分片之后还有分片)前面两个字段标识了同一报文、还有分片以及最后分片,为了避免分片的丢包,还需要13位片偏移字段进行校验是否丢了分片:该字段表示当前分片在原数据中的偏移位置,当前位置的偏移量+该分片的有效数据的长度=下一个分片的偏移量,而首个分片偏移为0,由此可以算出接下来的每一个分片的偏移位置,从而校验是否丢失了分片注:实际偏移的字节数是这个值× 8 \times 8×8得到的,因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了最大报文段长度MSS:实际数据分片的根本原因在于传输层一次向下交付的数据太多了,导致IP无法直接将数据向下交给MAC帧,因此TCP作为传输控制协议需要控制一次向下交付数据不能超过阈值MSS(Maximum Segment Size最大报文段长度)MAC帧的有效载荷最大为MTU,TCP的有效载荷最大为MSS,由于TCP和IP常规情况下报头的长度都是20字节,因此一般情况下 MSS = MTU - 20 - 20,而MTU的值一般是1500字节,因此MSS的值一般就是1460字节,所以一般建议TCP将发送的数据控制在1460字节以内,此时就能够降低数据分片的可能性。之所以说是降低数据分片的可能性,是因为每个网络的链路层对应的MTU可能是不同的三、网段划分基本概念:IP地址分为两个部分, 网络号和主机号网络号: 保证相互连接的两个网段具有不同的标识主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号示图:说明:不同的子网其实就是把网络号相同的主机放到一起如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同手动管理子网内的IP, 而有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器划分网络号和主机号的方案:五类IP地址示图:说明:A类 0.0.0.0到127.255.255.255B类 128.0.0.0到191.255.255.255C类 192.0.0.0到223.255.255.255D类 224.0.0.0到239.255.255.255E类 240.0.0.0到247.255.255.255注意:随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址,然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了,针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing)子网掩码引入一个额外的子网掩码(subnet mask)来区分网络号和主机号子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号网络号和主机号的划分与这个IP地址是A类、B类还是C类无关示图:说明:IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围IP地址和子网掩码还有一种更简洁的表示方法:例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0特殊的IP地址:将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1四、IP地址数量限制概念及介绍:IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿,另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用三种解决方式:动态分配IP地址:只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的NAT技术:能够让不同局域网当中同时存在两个相同的IP地址,NAT技术不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机IPv6:IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址,目前IPv6还没有普及五、私有和公网IP地址私有IP地址范围:如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC1918规定了用于组建局域网的私有IP地址10.* ,前8位是网络号,共16,777,216个地址172.16.到172.31.,前12位是网络号,共1,048,576个地址192.168.*,前16位是网络号,共65,536个地址包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP)示图:说明:一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP)路由器LAN口连接的主机, 都从属于当前这个路由器的子网中不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是不同子网的IP地址就可以重复了每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN口IP就是一个公网IP了子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换)如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买运营商的作用:实际网络通信的基础设施都是运营商搭建的,我们访问服务器的数据并不是直接发送到了对应的服务器,而是需要经过运营商建设的各种基站以及各种路由器,最终数据才能到达对应的服务器用户上网的数据首先必须经过运营商的相关网络设备,然后才能发送到互联网公司对应的服务器,而所谓的网段划分、子网划分等工作实际都是运营商做的NAT技术什么是NAT:NAT(Network Address Translator,网络地址转换)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术,NAT实际上是为解决IPv4地址短缺而开发的技术NAT工作机制:以 10.0.0.10 的主机与 163.221.120.9 的主机进行通信为例讲解 NAT 的工作机制。利用 NAT,途中的 NAT 路由器将发送源地址从 10.0.0.10 转换为全局的 IP 地址(202.244.174.37)再发送数据反之,当响应数据从 163.221.120.9 发送过来时,目标地址(202.244.174.37)先被转换成私有 IP 地址 10.0.0.10 以后再被转发示图:注意:网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关NAT 路由器在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换网络访问只能先由私网侧发起,公网无法主动访问私网主机(不存在替换会话,无法找到对应的私网主机)NAT 路由器的存在对通信双方是保持透明的NAT 路由器为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来NAT类型:NAT 有 3 中类型:静态NAT,动态NAT,端口复用NAPT静态NAT内部本地地址一对一转换成内部全局地址,相当内部本地的每一台PC都绑定了一个全局地址。一般用于在内网中对外提供服务的服务器动态NAT在内部本地地址转换的时候,在地址池中选择一个空闲的,没有正在被使用的地址,来进行转换,一般选择的是在地址池定义中排在前面的地址,当数据传输或者访问完成时就会放回地址池中,以供内部本地的其他主机使用,但是,如果这个地址正在被使用的时候,是不能被另外的主机拿来进行地址转换的端口复用NAPT面对私网内部数量庞大的主机,如果NAT只进行IP地址的简单替换,就会产生一个问题:当有多个内部主机去访问同一个服务器时,从返回的信息不足以区分响应应该转发到哪个内部主机。此时,需要 NAT 设备根据传输层信息或其他上层协议去区分不同的会话,并且可能要对上层协议的标识进行转换,比如 TCP 或 UDP 端口号。这样 NAT 网关就可以将不同的内部连接访问映射到同一公网IP的不同传输层端口,通过这种方式实现公网IP的复用和解复用。这种方式也被称为端口转换PAT、NAPT或IP伪装,但更多时候直接被称为NAT,因为它是最典型的一种应用模式如下图所示:以私网 10.0.0.10 和 10.0.0.11 的主机与外网 163.221.120.9 的主机进行通信为例讲解 NAPT 的工作机制解释:主机 163.221.120.9 的端口号是 80,私网中有 2 个客户端 10.0.0.10 和 10.0.0.11 同时进行通信,并且这 2 个客户端的本地端口都是 1025。此时,仅仅转换 IP 地址为全局地址 202.244.174.37 ,会令转换后的数字完全一致因此,为了区分这 2 个会话,只要将 10.0.0.11 的端口号转换为 1026 就可以解决问题。NAPT 路由器通过生成转换表,就可以正确地转换地址跟端口的组合,使客户端A、B能同时与服务器之间进行通信利用端口号的唯一性实现了公网 IP 到私网 IP 的转换,理论上最多可以让 65535 台主机共用一个公网 IP 地址NAT技术的优缺点:优点节省合法的公有 IP 地址(最大的优点)当网络发生变化时,避免重新编址对外隐藏内部地址,增加网络安全性(网络访问只能先由私网侧发起,公网无法主动访问私网主机)缺点无法从NAT 的外部向内部服务器建立连接(NAT穿越)转换表的生成和转换操作都会产生一定的开销通信过程中一旦 NAT 遇到异常需重新启动时,所有的 TCP 连接都将被重置。即使备置两台 NAT 做容灾备份,TCP 连接还是会被断开六、路由概念及介绍:数据的发送和转发就是在复杂的网络结构中, 找出一条通往终点的路线路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程数据在路由的过程中,实际就是一跳一跳(Hop by Hop)“问路”的过程。所谓“一跳”就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间示图:说明:IP数据包的传输过程也和问路一样当IP数据包, 到达路由器时, 路由器会先查看目的IP路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器依次反复, 一直到达目标IP地址而判定当前这个数据包该发送位置就是依靠每个节点内部维护一个路由表路由器的查找结果处理行为:得知该数据下一跳应该跳到哪一个子网,转发给下一个子网没有发现匹配的子网,此时路由器会将该数据转发给默认路由目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机路由表查询的具体过程:每个路由器内部会维护一个路由表,我们可以通过route命令查看云服务器上对应的路由表示图:解释:Flags中,U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,依次与路由表中的子网掩码 Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出(Iface代表的是发送接口)如果将该数据包的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由路由表生成算法:静态路由:是指由网络管理员手工配置路由信息动态路由:是指路由器能够通过算法自动建立自己的路由表,并且能够根据实际情况进行调整
面试 HTTP ,99% 的面试官都爱问这些问题(一)
HTTP 和 HTTPS 的区别HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范HTTP 主要内容分为三部分,超文本(Hypertext)、传输(Transfer)、协议(Protocol)。超文本就是不单单只是本文,它还可以传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转。上面这些概念可以统称为数据,传输就是数据需要经过一系列的物理介质从一个端系统传送到另外一个端系统的过程。通常我们把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方。而协议指的就是是网络中(包括互联网)传递、管理信息的一些规范。如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间的相互通信需要共同遵守一定的规则,这些规则就称为协议,只不过是网络协议。说到 HTTP,不得不提的就是 TCP/IP 网络模型,一般是五层模型。如下图所示但是也可以分为四层,就是把链路层和物理层都表示为网络接口层还有一种就是 OSI 七层网络模型,它就是在五层协议之上加了表示层和会话层而 HTTPS 的全称是 Hypertext Transfer Protocol Secure,从名称我们可以看出 HTTPS 要比 HTTPS 多了 secure 安全性这个概念,实际上, HTTPS 并不是一个新的应用层协议,它其实就是 HTTP + TLS/SSL 协议组合而成,而安全性的保证正是 TLS/SSL 所做的工作。也就是说,HTTPS 就是身披了一层 SSL 的 HTTP。那么,HTTP 和 HTTPS 的主要区别是什么呢?最简单的,HTTP 在地址栏上的协议是以 http:// 开头,而 HTTPS 在地址栏上的协议是以 https:// 开头http://www.cxuanblog.com/
https://www.cxuanblog.com/HTTP 是未经安全加密的协议,它的传输过程容易被攻击者监听、数据容易被窃取、发送方和接收方容易被伪造;而 HTTPS 是安全的协议,它通过 密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法 能够解决上面这些问题。HTTP 的默认端口是 80,而 HTTPS 的默认端口是 443。HTTP Get 和 Post 区别HTTP 中包括许多方法,Get 和 Post 是 HTTP 中最常用的两个方法,基本上使用 HTTP 方法中有 99% 都是在使用 Get 方法和 Post 方法,所以有必要我们对这两个方法有更加深刻的认识。get 方法一般用于请求,比如你在浏览器地址栏输入 www.cxuanblog.com 其实就是发送了一个 get 请求,它的主要特征是请求服务器返回资源,而 post 方法一般用于表单的提交,相当于是把信息提交给服务器,等待服务器作出响应,get 相当于一个是 pull/拉的操作,而 post 相当于是一个 push/推的操作。get 方法是不安全的,因为你在发送请求的过程中,你的请求参数会拼在 URL 后面,从而导致容易被攻击者窃取,对你的信息造成破坏和伪造;/test/demo_form.asp?name1=value1&name2=value2而 post 方法是把参数放在请求体 body 中的,这对用户来说不可见。POST /test/demo_form.asp HTTP/1.1Host: w3schools.comname1=value1&name2=value2get 请求的 URL 有长度限制,而 post 请求会把参数和值放在消息体中,对数据长度没有要求。get 请求会被浏览器主动 cache,而 post 不会,除非手动设置。get 请求在浏览器反复的 回退/前进 操作是无害的,而 post 操作会再次提交表单请求。get 请求在发送过程中会产生一个 TCP 数据包;post 在发送过程中会产生两个 TCP 数据包。对于 get 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 post,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。什么是无状态协议,HTTP 是无状态协议吗,怎么解决无状态协议(Stateless Protocol) 就是指浏览器对于事务的处理没有记忆能力。举个例子来说就是比如客户请求获得网页之后关闭浏览器,然后再次启动浏览器,登录该网站,但是服务器并不知道客户关闭了一次浏览器。HTTP 就是一种无状态的协议,他对用户的操作没有记忆能力。可能大多数用户不相信,他可能觉得每次输入用户名和密码登陆一个网站后,下次登陆就不再重新输入用户名和密码了。这其实不是 HTTP 做的事情,起作用的是一个叫做 小甜饼(Cookie) 的机制。它能够让浏览器具有记忆能力。如果你的浏览器允许 cookie 的话,查看方式 chrome://settings/content/cookies也就说明你的记忆芯片通电了…… 当你向服务端发送请求时,服务端会给你发送一个认证信息,服务器第一次接收到请求时,开辟了一块 Session 空间(创建了Session对象),同时生成一个 sessionId ,并通过响应头的 Set-Cookie:JSESSIONID=XXXXXXX 命令,向客户端发送要求设置 Cookie 的响应;客户端收到响应后,在本机客户端设置了一个 JSESSIONID=XXXXXXX 的 Cookie 信息,该 Cookie 的过期时间为浏览器会话结束;接下来客户端每次向同一个网站发送请求时,请求头都会带上该 Cookie信息(包含 sessionId ), 然后,服务器通过读取请求头中的 Cookie 信息,获取名称为 JSESSIONID 的值,得到此次请求的 sessionId。这样,你的浏览器才具有了记忆能力。还有一种方式是使用 JWT 机制,它也是能够让你的浏览器具有记忆能力的一种机制。与 Cookie 不同,JWT 是保存在客户端的信息,它广泛的应用于单点登录的情况。JWT 具有两个特点JWT 的 Cookie 信息存储在客户端,而不是服务端内存中。也就是说,JWT 直接本地进行验证就可以,验证完毕后,这个 Token 就会在 Session 中随请求一起发送到服务器,通过这种方式,可以节省服务器资源,并且 token 可以进行多次验证。JWT 支持跨域认证,Cookies 只能用在单个节点的域或者它的子域中有效。如果它们尝试通过第三个节点访问,就会被禁止。使用 JWT 可以解决这个问题,使用 JWT 能够通过多个节点进行用户认证,也就是我们常说的跨域认证。UDP 和 TCP 的区别TCP 和 UDP 都位于计算机网络模型中的运输层,它们负责传输应用层产生的数据。下面我们就来聊一聊 TCP 和 UDP 分别的特征和他们的区别UDP 是什么UDP 的全称是 User Datagram Protocol,用户数据报协议。它不需要所谓的握手操作,从而加快了通信速度,允许网络上的其他主机在接收方同意通信之前进行数据传输。数据报是与分组交换网络关联的传输单元。UDP 的特点主要有UDP 能够支持容忍数据包丢失的带宽密集型应用程序UDP 具有低延迟的特点UDP 能够发送大量的数据包UDP 能够允许 DNS 查找,DNS 是建立在 UDP 之上的应用层协议。TCP 是什么TCP 的全称是Transmission Control Protocol ,传输控制协议。它能够帮助你确定计算机连接到 Internet 以及它们之间的数据传输。通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接。TCP 的主要特点有TCP 能够确保连接的建立和数据包的发送TCP 支持错误重传机制TCP 支持拥塞控制,能够在网络拥堵的情况下延迟发送TCP 能够提供错误校验和,甄别有害的数据包。 </div>
看完这篇 HTTPS,和面试官扯皮就没问题了(上)v
HTTPS 为什么会出现一个新技术的出现必定是为了解决某种问题的,那么 HTTPS 解决了 HTTP 的什么问题呢?HTTPS 解决了什么问题一个简单的回答可能会是 HTTP 它不安全。由于 HTTP 天生明文传输的特性,在 HTTP 的传输过程中,任何人都有可能从中截获、修改或者伪造请求发送,所以可以认为 HTTP 是不安全的;在 HTTP 的传输过程中不会验证通信方的身份,因此 HTTP 信息交换的双方可能会遭到伪装,也就是没有用户验证;在 HTTP 的传输过程中,接收方和发送方并不会验证报文的完整性,综上,为了解决上述问题,HTTPS 应用而生。什么是 HTTPS你还记得 HTTP 是怎么定义的吗?HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol) 协议,它 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范,那么我们看一下 HTTPS 是如何定义的HTTPS 的全称是 Hypertext Transfer Protocol Secure,它用来在计算机网络上的两个端系统之间进行安全的交换信息(secure communication),它相当于在 HTTP 的基础上加了一个 Secure 安全的词眼,那么我们可以给出一个 HTTPS 的定义:HTTPS 是一个在计算机世界里专门在两点之间安全的传输文字、图片、音频、视频等超文本数据的约定和规范。HTTPS 是 HTTP 协议的一种扩展,它本身并不保传输的证安全性,那么谁来保证安全性呢?在 HTTPS 中,使用传输层安全性(TLS)或安全套接字层(SSL)对通信协议进行加密。也就是 HTTP + SSL(TLS) = HTTPS。HTTPS 做了什么HTTPS 协议提供了三个关键的指标加密(Encryption), HTTPS 通过对数据加密来使其免受窃听者对数据的监听,这就意味着当用户在浏览网站时,没有人能够监听他和网站之间的信息交换,或者跟踪用户的活动,访问记录等,从而窃取用户信息。数据一致性(Data integrity),数据在传输的过程中不会被窃听者所修改,用户发送的数据会完整的传输到服务端,保证用户发的是什么,服务器接收的就是什么。身份认证(Authentication),是指确认对方的真实身份,也就是证明你是你(可以比作人脸识别),它可以防止中间人攻击并建立用户信任。有了上面三个关键指标的保证,用户就可以和服务器进行安全的交换信息了。那么,既然你说了 HTTPS 的种种好处,那么我怎么知道网站是用 HTTPS 的还是 HTTP 的呢?给你两幅图应该就可以解释了。HTTPS 协议其实非常简单,RFC 文档很小,只有短短的 7 页,里面规定了新的协议名,默认端口号443,至于其他的应答模式、报文结构、请求方法、URI、头字段、连接管理等等都完全沿用 HTTP,没有任何新的东西。也就是说,除了协议名称和默认端口号外(HTTP 默认端口 80),HTTPS 协议在语法、语义上和 HTTP 一样,HTTP 有的,HTTPS 也照单全收。那么,HTTPS 如何做到 HTTP 所不能做到的安全性呢?关键在于这个 S 也就是 SSL/TLS 。什么是 SSL/TLS认识 SSL/TLSTLS(Transport Layer Security) 是 SSL(Secure Socket Layer) 的后续版本,它们是用于在互联网两台计算机之间用于身份验证和加密的一种协议。注意:在互联网中,很多名称都可以进行互换。我们都知道一些在线业务(比如在线支付)最重要的一个步骤是创建一个值得信赖的交易环境,能够让客户安心的进行交易,SSL/TLS 就保证了这一点,SSL/TLS 通过将称为 X.509 证书的数字文档将网站和公司的实体信息绑定到加密密钥来进行工作。每一个密钥对(key pairs) 都有一个 私有密钥(private key) 和 公有密钥(public key),私有密钥是独有的,一般位于服务器上,用于解密由公共密钥加密过的信息;公有密钥是公有的,与服务器进行交互的每个人都可以持有公有密钥,用公钥加密的信息只能由私有密钥来解密。什么是 X.509:X.509 是公开密钥证书的标准格式,这个文档将加密密钥与(个人或组织)进行安全的关联。X.509 主要应用如下SSL/TLS 和 HTTPS 用于经过身份验证和加密的 Web 浏览通过 S/MIME 协议签名和加密的电子邮件代码签名:它指的是使用数字证书对软件应用程序进行签名以安全分发和安装的过程。通过使用由知名公共证书颁发机构(例如SSL.com)颁发的证书对软件进行数字签名,开发人员可以向最终用户保证他们希望安装的软件是由已知且受信任的开发人员发布;并且签名后未被篡改或损害。还可用于文档签名还可用于客户端认证政府签发的电子身份证(详见 https://www.ssl.com/article/pki-and-digital-certificates-for-government/)我们后面还会讨论。HTTPS 的内核是 HTTPHTTPS 并不是一项新的应用层协议,只是 HTTP 通信接口部分由 SSL 和 TLS 替代而已。通常情况下,HTTP 会先直接和 TCP 进行通信。在使用 SSL 的 HTTPS 后,则会先演变为和 SSL 进行通信,然后再由 SSL 和 TCP 进行通信。也就是说,HTTPS 就是身披了一层 SSL 的 HTTP。(我都喜欢把骚粉留在最后。。。)SSL 是一个独立的协议,不只有 HTTP 可以使用,其他应用层协议也可以使用,比如 SMTP(电子邮件协议)、Telnet(远程登录协议) 等都可以使用。探究 HTTPS我说,你起这么牛逼的名字干嘛,还想吹牛批?你 HTTPS 不就抱上了 TLS/SSL 的大腿么,咋这么牛批哄哄的,还想探究 HTTPS,瞎胡闹,赶紧改成 TLS 是我主,赞美我主。SSL 即安全套接字层,它在 OSI 七层网络模型中处于第五层,SSL 在 1999 年被 IETF(互联网工程组)更名为 TLS ,即传输安全层,直到现在,TLS 一共出现过三个版本,1.1、1.2 和 1.3 ,目前最广泛使用的是 1.2,所以接下来的探讨都是基于 TLS 1.2 的版本上的。TLS 用于两个通信应用程序之间提供保密性和数据完整性。TLS 由记录协议、握手协议、警告协议、变更密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密码学前沿技术(如果你觉得一项技术很简单,那你只是没有学到位,任何技术都是有美感的,牛逼的人只是欣赏,并不是贬低)。说了这么半天,我们还没有看到 TLS 的命名规范呢,下面举一个 TLS 例子来看一下 TLS 的结构ECDHE-ECDSA-AES256-GCM-SHA384这是啥意思呢?我刚开始看也有点懵啊,但其实是有套路的,因为 TLS 的密码套件比较规范,基本格式就是 密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法 组成的一个密码串,有时候还有分组模式,我们先来看一下刚刚是什么意思使用 ECDHE 进行密钥交换,使用 ECDSA 进行签名和认证,然后使用 AES 作为对称加密算法,密钥的长度是 256 位,使用 GCM 作为分组模式,最后使用 SHA384 作为摘要算法。TLS 在根本上使用对称加密和 非对称加密 两种形式。对称加密在了解对称加密前,我们先来了解一下密码学的东西,在密码学中,有几个概念:明文、密文、加密、解密明文(Plaintext),一般认为明文是有意义的字符或者比特集,或者是通过某种公开编码就能获得的消息。明文通常用 m 或 p 表示密文(Ciphertext),对明文进行某种加密后就变成了密文加密(Encrypt),把原始的信息(明文)转换为密文的信息变换过程解密(Decrypt),把已经加密的信息恢复成明文的过程。对称加密(Symmetrical Encryption)顾名思义就是指加密和解密时使用的密钥都是同样的密钥。只要保证了密钥的安全性,那么整个通信过程也就是具有了机密性。TLS 里面有比较多的加密算法可供使用,比如 DES、3DES、AES、ChaCha20、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK 等。目前最常用的是 AES-128, AES-192、AES-256 和 ChaCha20。DES 的全称是 Data Encryption Standard(数据加密标准) ,它是用于数字数据加密的对称密钥算法。尽管其 56 位的短密钥长度使它对于现代应用程序来说太不安全了,但它在加密技术的发展中具有很大的影响力。3DES 是从原始数据加密标准(DES)衍生过来的加密算法,它在 90 年代后变得很重要,但是后面由于更加高级的算法出现,3DES 变得不再重要。AES-128, AES-192 和 AES-256 都是属于 AES ,AES 的全称是Advanced Encryption Standard(高级加密标准),它是 DES 算法的替代者,安全强度很高,性能也很好,是应用最广泛的对称加密算法。ChaCha20 是 Google 设计的另一种加密算法,密钥长度固定为 256 位,纯软件运行性能要超过 AES,曾经在移动客户端上比较流行,但 ARMv8 之后也加入了 AES 硬件优化,所以现在不再具有明显的优势,但仍然算得上是一个不错算法。(其他可自行搜索) </div>
udp和tcp的相同点
最近看了计网的资料和视频,以及其他博主的资料,对最近所学的知识进行以下总结,方便让其他小伙伴儿参考学习,也利于自己巩固,回头复习用,如果有什么不对的地方还请大佬指正。udp和tcp的相同点udp和tcp的不同点udp和tcp都是传输层的协议,目的都是传输数据udp的介绍UDP协议全称是用户数据报协议(User Datagram Protocol),在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI(Open System Interconnection,开放式系统互联)模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。其特点如下:1.面向无连接首先 UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。具体来说就是:在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作可以理解为如下生活中的例子:在你给朋友发送文件上,你将文件压缩成压缩包,不需要对方在线就能发送到对方消息列表里而如果你发送文件,没有打成压缩包形式的话,是需要对方保存电脑在线的,不然无法接收到文件2.有单播,多播,广播的功能UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。3.UDP是面向报文的发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文4.不可靠性首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠。并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。5.头部开销小,传输数据报文时是很高效的首部开销仅8个字节,而TCP首部至少20个字节。tcp的介绍当一台计算机想要与另一台计算机通讯时,两台计算机之间的通信需要畅通且可靠,这样才能保证正确收发数据。TCP协议全称是传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。流就是指不间断的数据结构,你可以把它想象成排水管中的水流。声明:三次握手和四次挥手会在下一篇详细介绍TCP协议的特点1.面向连接面向连接,是指发送数据之前必须在两端建立连接。建立连接的方法是“三次握手”,这样能建立可靠的连接。建立连接,是为数据的可靠传输打下了基础2.仅支持单播传输每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式3.TCP面向字节流TCP不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字节流方式进行传输。4.可靠传输对于可靠传输,判断丢包,误码靠的是TCP的段编号以及确认号。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。5.提供拥塞控制当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞6.TCP提供全双工通信TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)TCP和UDP的介绍到这里就结束了,如果有什么不对的地方欢迎大佬指正,下一篇会详细介绍TCP三次握手和四次挥手的连接与释放,如果感兴趣的可以留意哦。
TCP三次握手
1.4.5.3 IPV6数据报格式名称 作用 位数版本 Version 知名协议版本,此处因为是ipv6所以总是6 4位优先级 Traffic Class 又来区分数据报的类型和优先级 8位流标签 Flow Label 和ipv4标识某个数据报分片不同,这是对于一整个数据报流的标记 19位有效载荷长度 Payload Length 指的是扩展首部+数据部分的大小,和ipv4的总长度和首部长度都不同,ipv6的首部长度是固定的40字节 16位下一个首部 Next Header 基本首部的下一个首部指的是有效载荷里标记的的扩展首部,有效载荷里的扩展首部再指向有效载荷里标记的的扩展首部,直至最后指向数据 8位跳数限制 Hop Limit 基本相当于ipv4当中的TTL,每到一个路由器-1.减到0时丢弃 7位源地址 Source Address 发送方ipv6地址 128位目标地址 Destination Address 接收方ipv6地址 128位1.5.4.4 UDP校验方式总结一下步骤:在发送端的时候:1.就是将每一行(4字节)拆成两部分,左右平均2字节大小,将这两字节数据写成二进制,那么2字节一共就需要2*8=16位。此时检验和没有计算,默认填充0,同时如果数据字段不整齐,则用0补齐,这样就可以写出几十行二进制数,如图中方所示2.计算着几十行二进制数按二进制反码运算求和,二进制反码运算可以参考二进制反码求和运算得到的最后简介再反码,之后将反码之后的放入原来的检验和字段在接收端的时候:与发送端的时候不同的是,此时检验和字段不是0了按照发送端的步骤再将所有数据写成二进制进行二进制反码运算求和如果最后得到结果全1就是没问题,否则丢弃1.5.5.2 TCP报文段的首部注释:见上图,可以看到TCP是将数据随机分割后加上TCP头传输的,所以序号就是为了标记这些随机分割之后的数据,这里把第一个字节的编号当成序号确认号就是收到之后做一下标记,代表这之前的都收到了,希望收到的下一个编号的数据就是确认号打头的那个数据偏移量就是为了标记一下距离TCP开始多少字节是数据,这里的单位是4B,这个偏移量就是TCP首部长度1.5.5.4 TCP三次握手(建立连接)名称 作用SYN 同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1FIN 用于释放连接,为1时表示发送方没有发送了ACK 为1表示确认号有效,为0表示报文不含确认信息,忽略确认号字段,上面的确认号是否有效就是通过该标识控制的ack 是期望收到对方下一个报文段的第一个数据字节的序号seq TCP连接中传送的字节流中的每个字节都按顺序编号注释:第一段的意思是:SYN同步序号=1:(A)要建立连接了!seq序号=x(随机):因为还没有数据,所以写什么都无所谓第二段的意思是:SYN同步序号=1:我(B)同意你(A)建立连接!ACK确认序号=1:连接建立了,之后的ACK必须都置为1seq序号=y(随机):因为还没有数据,所以写什么都无所谓ack确认号=x+1:之前发送方(A)说发送的是第x位数据(虽然发送方是瞎说的),所以我(B)要的是x+1位数据第三段的意思是:SYN=0:SYN只有在建立连接时才为1,其他时候均设为0ACK=1:连接建立了,之后的ACK必须都置为1seq=x+1:我(A)发送的报文段的第一个字节就是x+1ack=y+1:之前接收方(B)说发送的是第y位数据(虽然接收方是瞎说的),所以我(A)要的是y+1位数据注意一下,TCP是双向的,所以不存在绝对不变的发送方接收方,这里的两台主机都同时是发送方和接收方
CSMA/CD协议
1.4.3 IP数据报IP数据报格式:名称 注释 大小版本 Version ipv4或者ipv6 4位首部长度 IHL 此处数值再乘以4才是真正大小,同时因为IP数据报固定长度为20字节,所以此处最小值为5,即二进制的0101 4位区分服务 DSCP + ECN 希望获得哪种服务,用的比较少 8位总长度 Total Length 首部+数据的长度,最大为2^16-1=65535 16位标识 Identification 用来表示是哪一个数据报的分片,不同的分片标识各不相同 8位标志 Flags 用来表示是否分片和分片是否结束 3位,但实际有用的只有后两位片偏移 Fragment Offset 用来标记分片之后,该分片在原来的数据报的位置,以8字节为单位 13位生存时间 Time To Live 即TTL,没经过一个路由器TTL-1,0时自动放弃,根据系统不同默认的TTL不同 8位协议 Protocol 用来标记协议名的字段值,如TCP,UDP,ICMP等等 8位首部检验和 Header Checksum 检验首部的字段是否出错,出错就丢弃此数据报 源地址 Source IP Address 发送方ip地址 32位目的地址 Destination IP Address 接收方ip地址 32位可选字段 Options 用来排错等安全检测 未知,可在0-40位之间填充 将数据报对齐成4字节的整数倍,数值全部为0 未知,根据可选字段来定计算偏移量时记住是以0开始的就行,以每一篇最开始的除以8得到的数值就是偏移量解释一下为什么A类最大是126.xxx.xxx.xxx?因为网络号最开始第一位是0,一共八位,所以二进制表示位0xxxxxxx,最大就是2^7-1=127,但是因为127.xxx.xxx.xxx是特殊ip地址,所以将其去掉为什么B类最大是191.255.xxx.xxx?因为网络号最开始第一位是10,一共八位,所以二进制表示位10xxxxxx,最大就是10111111=191,最小就是10000000=128,无特殊ip地址为什么C类最大是223.255.xxx.xxx?因为网络号最开始第一位是110,一共八位,所以二进制表示位110xxxxx,最大就是11011111=223,最小就是10000000=192,无特殊ip地址1.4.4.2 子网划分和子网掩码1.4.4.2.1 子网划分和子网掩码总结一下,就是ip利用率太低造成对ip资源的浪费,所以需要子网划分提高ip利用率1.4.4.2.2 子网掩码子网掩码就是用来和ip地址一起计算子网的地址的方法就是讲子网掩码逐位写成二进制然后而原来ip地址进行与运算,就可以得到子网ip地址因为255是11111111,所以如果写着255的话,ip地址和子网ip地址对应的地方的数值就相同这道题可以看出来,即使子网掩码不同,相同ip地址对应的子网ip地址也可能相同但是子网掩码不同,划分的子网数目不同为什么划分的子网数目不同?或者说怎么算划分的子网位数目?以255.255.192.0为例,255是11111111即八个1,192是11000000即2个1,一共是82+2=18个1,一共有32位地址,所以剩余有32-18=14位以255.255.224.0为例,255是11111111即八个1,224是11100000即3个1,一共是82+3=19个1,一共有32位地址,所以剩余有32-19=13位注释:1.这里特定主机路由就是指找特定的处理这里这个ip地址的路由2.默认路由会将这个数据报发给另一个路由,直至找到对应的路由,或者TTL耗尽被丢弃使用CIDR可以聚合网络如图,通过缩短前缀,R1和R2就可以合并在206.1.0.0/16的子网下但是这样转发表之中就会有多个匹配结果,所以我们使用最长前缀匹配
广域网使用的链路层协议
1.3.2.2.3 CSMA/CD协议因为链路实际有长短,发送数据需要时间,这个时间内可能就被其他节点当成空闲状态导致发生碰撞。先侦听信道,如果没有其它节点在使用信道,则传输数据。但是有碰撞检测,如果发生碰撞,会停止传输剩下的数据,等待一个随机时间(通常比传输一帧短)后,再进行尝试。知道自己发生碰撞的最长时间是2τ(两倍的传播时延),就是一去一回1.3.2.3 动态分配信道–轮询访问协议主要包括两大类,一个是轮询协议,另一个是令牌传递协议1.3.2.3.1 轮询协议就是选出一个代表,让他控制所有的传输注释:轮询开销在随着服务的节点越多,需要用于查询是否发送数据发送的数据帧也就越多,会造成一定开销等待延迟就是因为这是轮流“邀请”,所以难免某个节点需要发送数据,但是主节点还在较远的需要里有需求的节点那边,导致需求得不到立即响应单点故障很好理解,就是代表挂了1.3.2.3.2 令牌传递协议注释:在节点之间没有收发数据的需求时,令牌在节点之间循环。发送数据的流程当一个节点需要时就可以获得这个令牌。然后修改这个令牌的状态(空闲->占用)再将令牌与数据帧结合,让其在节点构成的环之间流动不是目的地的节点收到令牌也不接受,直接略过,目标节点收到信息并复制一份到本地(传输完成),因为是个闭环,所以发送节点最后得到令牌最后,发送令牌的节点对令牌的内容进行检查,如果发现数据出错还要重新发一遍问题基本和轮询协议相同1.3.3.1 广域网使用的链路层协议1.3.3.1.1 PPP协议(Point-to-Point Protocol)PPP协议是目前使用最广泛的数据链路层协议,拨号基本都是PPP协议PPP协议仅支持全双工链路PPP协议需要满足的要求:1.4 网络层重点1.4.1 数据交换方式为什么要进行数据交换?因为每个节点之间都拉网线太麻烦了也不实际,所以通过大量交换设备互联进行数据交换1.4.1.1 电路交换常见的例子:打电话注释:链路支持多路复用(可参考数据链路层的TDM等)特点是独占资源,因为两者建立了连接1.4.1.2 报文交换注释:报文发送的过程1.源先根据报文加上ip地址,物理地址等,通过物理层发送2.交换机收到报文之后,先进行存储,等待链路空闲之后进行转发,但是转发的路径不是固定的,是比较随机的3.最后通过许多交换机最终到达目的地1.4.1.3 分组交换分组交换和报文交换基本相同,就是将报文切割之后再进行发送1.4.1.3.1 分组传输的两种传输方式-数据报与虚电路1.4.2.1.5 距离向量算法注释:为什么改地址?因为图中是从x得到的信息为什么距离固定+1?因为路由器只从相邻路由器之间获取RIP报文,举例只会是1为什么下一跳是x就要替换?因为网络环境不断变化,可能这次某个节点挂掉,所以保持最新的为什么下一跳不是x时有更新和不处理两种手段?因为这样可以提高效率,比原来快就换,比原来慢就保留原来的,也可以理解
OSI七层参考模型
1.计算机网络1.1计算机网络重点概述1.1.1 计算机网络分层结构为什么要分层,分层要做什么:(1)发起通信的计算机必须将数据通信的通路进行激活。(2)要告诉网络如何识别目的主机。(3)发起通信的计算机要查明目的主机是否开机,并且与网络连接正常。(4)发起通信的计算机要弄清楚,对方计算机中文件管理程序是否已经做好准备工作。(5)确保差错和意外可以解决。1.1.2 OSI七层参考模型名称 英文 作用应用层 Application Layer 直接为用户的应用进程(例如电子邮件、文件传输和终端仿真)提供服务。如HTTP、SMTP、FTP、DNS等表示层 Presentation Layer 把数据转换为能与接收者的系统格式兼容并适合传输的格式,即让两个系统可以交换信息会话层 Session Layer 负责在数据传输中设置和维护计算机网络中两台计算机之间的通信连接传输层 Transport Layer 负责端到端通讯,可靠传输,不可靠传输 ,流量控制,复用分用网络层 Network Layer 负责选择路由最佳路径,规划IP地址(ipv4和ipv6变化只会影响网络层),拥塞控制数据链路层 Data Link Layer 帧的开始和结束,还有透明传输,差错校验(纠错由传输层解决)物理层 Physical Layer 定义网络设备接口标准,电气标准(电压),如何在物理链路上传输的更快OSI七层参考模型通信过程:网络层及以上,每一层都要对上一层发送的数据进行处理(加个头部)数据链路层不仅需要加头部,还需要加尾部物理层什么都不加,只管发送数据(比特流)1.2 物理层重点(没啥重点)1.3 数据链路层重点1.3.1 数据链路层的流量控制和可靠传输流量控制是为了让传输过程中的发送速度和接受速度匹配,减少传输出错与资源浪费可靠传输是发送端发送什么,接收端就要受到什么停止等待协议的无差错情况:注释:因为一次就一个,所以用0和1标记ACK(确认序号)就行停止等待协议的有差错情况:使用一个超时计时器,每发一帧就开始计时,设置时间略长于一个RTT(往返时延)。发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延RTT=传播时延x2+处理时间(有时可能直接忽略)1.3.1.2 后退N帧协议(GBN)因为停止等待协议太浪费时间了,所以尝试采用GBN,发送连续多个数据帧,以增大信道利用率注释:累计确认:就是收到一个确认帧,那么它和它之前的所有帧都默认已收到,反之,如果某个确认帧没收到,那么它和它之后的所有帧都默认丢失(即使收到了也丢掉),进行重传下图是一个实例:注释:此图发送2帧时丢失,所以接收方几首收到后面的帧也是直接丢弃并且发送最晚收到的有效帧1的ACK,直至2帧的超时重传机制被触发进行重传并得到ACK之后,接收方才会接受2帧以及后面的帧如果所示,GBN的形式就像排队,接收端为所有帧“预定”了接收位置,如果接收端发送的数据因为某些原因没有接收到,即使收到了这一帧后面所有的帧,这些“排在后面的”帧也要被丢弃。
金鱼哥RHCA回忆录:RHCA回忆录---CL280介绍
个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL格言:努力不一定成功,但要想成功就必须努力支持我:可点赞、可收藏⭐️、可留言DO280在CA体系中,也是一门很长久的课程了,从我2018年学CA开始,就已经有这课程体系,当年的版本是3.5,现在是3.9,其实早就有4以上的版本,只不过没有普及到认证中。而280的3.9版本将要在今年之后结束周期,所以想早点拿取认证的童鞋,要抓紧时间,趁版本更换前快进行学习与考试。明年会更换为4的版本。PS: 更换版本后,官方建议的配置要求最少要64G内存的机器,突然感觉学习成本好高还是快努力学习先通过这一门考试。由于OpenShift 是把K8S封装多一层来部署的,可以说是管理K8S平台而用,因此 ,如果学习中有K8S的基础会更快上手。但由于很多从CSA、CE上来进行学习的童鞋是没相关接触的,因而,学习难度比较高,出现报错的时候,很多人会不知从何下手。但从考试的情况来说,由于是使用,只要准备充分,难度还是适中。因此,此门课程若要往深学习,应当先了解一下K8S,若对其各个组件的原理和协作有一定的了解,再来学习280的话会更事半功倍。还有就是docker的知识,这是平台使用中的基础。如若没机会使用OpenShift(哪有这么多有钱的企业或者公司使用此平台呢?更多都是使用K8S去了,你懂的),那了解常规操作足矣。毕竟人的精力是有限的,应当将时间用在更需要学习的地方。以下摘自官网介绍:https://www.redhat.com/zh/services/training-and-certification红帽 OpenShift 管理 II(CL210)课程概述配置、管理 OpenShift 集群和容器化应用并对其进行故障排除红帽 OpenShift 管理II :操作生产级 Kubernetes 集群 (DO280) 教您如何配置和管理 红帽OpenShift容器平台 并对其进行故障排除。这一基于实验的实训课程将向您展示如何验证集群是否安装成功、如何进行日常管理,以及如何对容器化应用的部署进行故障排除。本课程基于红帽OpenShift 容器平台3.9,改版后为 4.10。课程概要描述红帽 OpenShift 容器平台的集群安装和更新过程对应用部署问题进行故障排除以本地用户身份配置身份验证使用基于角色的访问权限控制 (RBAC) 来控制对项目的访问利用 TLS 加密,向集群外部的客户端开放应用使用网络策略在服务与应用之间配置网络隔离使用标签和选择器来配置应用调度借助资源限制和配额来限制应用的计算资源使用使用 Web 控制台管理集群和所部署的应用使用 Web 控制台安装 Kubernetes Operator课程培训对象本课程专为系统管理员、系统架构师以及想要安装和配置红帽 OpenShift 容器平台的开发人员而设计。有兴趣了解 OpenShift 集群的特性和功能的系统和软件架构师。对集群和容器化应用的持续管理感兴趣的系统管理员。对管理用户和应用的集群资源访问权限感兴趣的集群操作人员。有兴趣参与集群日常维护和故障排除的站点可靠性工程师。课程前提条件成为 红帽认证系统管理员,或具有同等的红帽企业 Linux 系统管理经验完成 红帽 OpenShift I (DO180),或具备同等的容器、Kubernetes 使用经验和 OpenShift 基础知识课堂环境介绍所有的系统都有一个普通用户:student,密码为:student。系统的root密码都是redhat。第四个和第五个虚拟机node1和node2,主机名分别为node1.lab.example.com和node2.lab.example.com,它们是OpenShift容器平台集群的节点。一个私有docker仓库,其中包含课程所需的镜像。一个是Git服务器,用于存储课程期间开发所用应用程序的源代码。一个带有Node.js开发模块库的Nexus服务器。classroom.example.com 作为环境网络与外部世界的NAT路由器,并为学生提供DNS、DHCP、HTTP等内容服务。使用两个名称 content.example.com 和 materials.example.com,提供在实践和实验练习中使用的课程内容。配套环境常规操作:F0宿主机密码:root/Asimov
F0普通用户密码;kiosk/redhat1. 如果是AMD CPU,可能出现如下报错MoTTY X11 proxy: Unsupported authorisation protocol
Unable to init server: Could not connect: Connection refused
qemu-system-x86_64: error: failed to set MSR 0xe1 to 0x0
qemu-system-x86_64: /build/qemu-BQ4hMP/qemu-4.2/target/i386/kvm.c:2691: kvm_buf_set_msrs: Assertion `ret == cpu->kvm_msr_buf->nmsrs' failed.
Aborted
这个是由于AMD CPU的兼容性问题,此时需要添加kvm参数,才能打开F0中的KVM虚拟机。
# 添加KVM参数
tee /etc/modprobe.d/qemu-system-x86.conf << EOF
options kvm ignore_msrs=1
EOF
# 重启Vmware的F0虚拟机
reboot2. 重置环境顺序# 如果之前有加载过其他课程环境,请执行以下命令,把所有虚拟机关机;如无,则跳过。
rht-vmctl poweroff all
rht-vmctl poweroff classroom
# 切换课程环境命令
rht-setcourse do280
# 切换课程环境后,进行课程环境所需虚拟机的初始化(重置)
# 必须先初始化classroom虚拟机,启动完成,再启动下一个
rht-vmctl fullreset classroom
# 其余虚拟机初始化可不按顺序
# 初始化workstation虚拟机
rht-vmctl fullreset workstation
# 初始化master虚拟机
rht-vmctl fullreset master
# 初始化node1虚拟机
rht-vmctl fullreset node1
......
# 初始化(重置)只在刚切换环境时进行,后续可使用reset命令进行虚拟机重置。3. 其余操作# 启动虚拟机
rht-vmctl start xxx
# 查看状态
rht-vmctl status xxx注意:rht-vmctl命令只对配套学习环境生效。总结每门课程都有其大纲和课程内容,都可在官网进行查看。了解好课程环境,每门CA环境的拓扑都大同小异。AMD CPU运行KVM报错,需要进行内核设置。课程切换后,需要遵循一些操作顺序,否则会出错。RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶。以上就是【金鱼哥】对 DO280开篇 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。红帽认证专栏系列:RHCSA专栏:戏说 RHCSA 认证RHCE专栏:戏说 RHCE 认证此文章收录在RHCA专栏:RHCA 回忆录如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】!
SpringCloud+Alibaba微服务教程,Java自学/进阶程序员必看
Spring Cloud是目前市面上最火爆的Java微服务技术栈,因其功能丰富涉及微服务管理全面,并且在高可靠、高可阔以及在应对复杂业务和承受并发的能力上发挥出色,使其受到众多互联网公司的青睐。很多公司逐步转型到微服务架构风格,所以springcloud是成为进阶Java开发高级工程师的必备技术栈。本套课程将带你深入学习SpringCloud相关技术,学成之后可以去手动去搭建一个项目,相当可以主导一个项目开发,让你在技术上有一个质的提升。https://www.bilibili.com/video/BV1f94y1U7AB课程特色1、入门简单但课程深入本套课程入门比较简单,陈老师在课程当中通过举一些生活中的案例去讲解它。同时入门之后课程中会有一些深入理解,比如说对它进行一些源码分析,对一些框架进行手写或改造。整个课程主要是让学生去深入理解它,并不是仅限于使用阶段。市面上有些课程它的入门起来比较难,会举很多复杂的案例,对新手来讲是不太友好,而我们这个课程它是一个循序渐进的过程,会从一些架构的发展的角度去讲,并不是说上来直接去写这个代码,上面有一个总体大局观,从大局开始往里面去深入学习,慢慢去理解。2、手写核心组件很多市面课程并没有去手写,或者说想去分析这个项目里面的源码,而我们这个课程基本上每个组件的源码都会进行分析,进行一些深度学习。本套课程会手写SpringCloud的一些核心的组件。第一个是注册中心,第二个就是远程调用,第三个是熔断器,后面还有网关等等内容。这里面我们手写了远程调用和熔断器的两个框架。手写框架这部分很重要,因为这能帮助我们去了解它的原理,如果我们对它的原理不理解的话,是不好去把它实现的。很多同学在学习这个框架的时候,只是会使用,而且出了问题,并不知道从哪一个角度去排查问题。而我们去手写的话,第一可以对这个框架有更深刻的印象,我们肯定是学习了他的一个思想,才能进行改造或者手写。比如说你只会用的话,那是工作里面如果出了问题,不知道怎么去调试,我们写完之后可能对它的印象会非常深刻。课程重点本套课程全部都是重点,我们主要挑的是市面上常用的一些组件来讲,因为SpringCloud的组件比较庞大,随便展开来讲都有至少30个以上,所以我们会选择其中几个进行讲解。1、注册中心这个是必须要先学的一个东西,是整个SpringCloud的基石。它是整个SpringCloud的一个入门,必须放在第一章来学习,如果不先学它,后面基本上就没办法学了,它是一个相当于是个开头的篇章。这一部分内容会从Eureka简介、以及它和其他注册中心的对比、它的快速入门集群搭建和源码分析等方面去讲解。这个SpringCloud Eureka其他组件也是一样的学习方式,我们会从基本入门开始再到深入理解,以及手动去实现部分组件的一些功能,让大家在以后的技术开发中找到相同的概念。经过学习,大家在以后的工作中也可以有章可循,轻松的去应对大型的微服务项目。2、Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现,通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模板请求自动转行成客户端负载均衡的服务调用。3、Feign远程调用Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。是服务和服务之间通讯的一个重点。4、断路器的hystrix熔断器,也叫断路器。(正常情况下,断路器是关的,只有出现了问题才会打开)用来保护微服务不雪崩的方法,思想上和课程内容中之前画的拦截器是一样的。5、网关(从P43开始讲解)网关是微服务最边缘的服务,直接暴露给用户,用来做用户和微服务的桥梁。6、SpringAlibabaSpringCloud是一个很大的社区,目前来说有几个公司在一起支持他,相当于SpringCloud它只是一个宏观的定义,那么像spring官方它提供了一些组件,相当于它自己搞了一套组件去开发,SpringAlibaba相当于是国产的一些组件去支持它,现在越来越多的公司趋向于国产化,我们要用自己中国人的技术,在这套视频里面,SpringAlibaba我们做了一个入门。SpringAlibaba这个组件国内的公司用的逐渐变多,也是会逐步取代像原始的SpringCloud的一些组件。7、nacos注册中心是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。视频里面有实战的项目吗?在本套课程里,我们有做一些简单的案例,在之后的整个教学过程中,学完之后后面会做一个比较大型的项目。项目怎么划分服务划分可从两个方面来讨论,这个东西没有明确的定义,我们可以按照功能来划分,也可以按照业务来划分,这是两个不同的点,这个需要去具体分析不能给出明确的定义。我们可以根据具体的业务场景来讨论,到底是按照功能划分还是按照业务划分。比如说一个要操作数据库的功能,要去操作一个es(elasticsearch,简称es)数据库,按照功能来整合到一起。还是说我们按照业务,比如说这个模块这个服务就是做用户相关的业务,那个模块就是做商品相关业务,这个东西没有明确的定义,可以按照业务和功能两个方面来讨论和划分,每个公司它的一个划分也是不太一样的,大部分通过这两种方式,业务和功能。课程学习基础这个课程主要是针对要有一定的一个架构基础,特别是有一定框架基础的,比如说一定要会SSM或者是SpringBoot框架才有能力去学习SpringCloud 框架,这个框架是Java中一个比较高级的框架。大概学习周期:如果是纯自学的话,大概是会在10天到半个月左右的时间,差不多可以去入门。课程改进这个课程主要是入门就比较简单,会举一些生活中的案例去讲解它。同时入门之后课程中会有一些深入理解,比如说对它进行一些源码分析,对一些框架进行手写或改造。整个课程主要是让学生去深入理解它,并不是仅限于使用阶段。课程目的对于一些已经工作的人来说,他们在哪些技术上会有提升,提升完之后会有一个怎样的效果?我们之前如果工作的话,它是仅限于公司项目的使用阶段,那么我们把这个课程学完之后,就可以去手动去搭建一个项目,相当可以主导一个项目开发,能有一个质的提升,并不是说你只会去用,我们只会去怎么启动怎么使用,而是学完之后,可以把我们整个的SpringCloud从0开始搭建一个,你可以自己当一个项目组长可以主导我们开发地位。相当于你可以去让这些组件之间怎么产生联系,怎么去进行一些搭配,你可以去把他们给利用起来。学习前提首先你要有一定基础才能学习这个课程,这套课程属于偏中等偏上的一个难度,对于新手和老手来讲,它都是有一定启发的。很多市面上的视频,它的讲解的内容比较偏向简单,它的源码什么的都没有看,它只是教了使用级别,但是如果出了问题,包括怎么去改造,怎么去进行一个整合,怎么去优化,都是没有讲到的。在我们课程中,老师则都会讲到。当然,关于springcloud的课程介绍,远不止文章里提到的,想要挖掘更多宝藏,赶紧打开链接学习起来吧!https://www.bilibili.com/video/BV1f94y1U7AB