
网络基本原理一、网络与网卡网络进程与进程间跨主机Host通信网卡网卡发送数据1.填充数据 2.触发发送网卡接收数据1.接收数据 2.通过中断把控制权交给OS 3.OS把数据搬给进程数据经过不断的封装之后才能发送有不同层次来实现网络现代网络都是分层讨论的。二、网络分层OSI/RM协议包括体系结构服务定义协议规范三级抽象将网络分为七层。物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。TCP/IP协议分为五层物理层、数据链路层、网络层、传输层、应用层。三、UDP 与 TCP一UDP协议(User Datagram Protocol)职责在网络层的基础上实现了进程to进程的的通信特点不可靠、无连接、面向数据报文1.包头UDP协议的包头信息UDP添加的封装解包、分用特点定长8字节很容易做解包源端口 目的端口 做分用进程 to 进程校验和checkusm防止错误数据的类似哈希的算法发送端hash(有效数据) h1接收端hash(有效数据) h2当h1 ! h2时数据一定出错直接丢弃h1 h2时大概率认为还是数据源数据。2.发送填充端口计算长度 填充长度计算checkusm 填充checkusm立即将数据交给网络层UDP协议栈内部没有发送缓冲区3.接收从网络层接收数据通过计算校验和检测数据是否出现错误如果出现错误则直接丢弃数据没有错根据自己内部维护Mapport,pid找到对应接收进程如果找不到对应进程丢弃看对应进程是否准备好一块内存如果暂时没有需要暂时把数据保存一段时间把数据复制到对应的内存空间 byte[] buf二TCP协议(Transmission Control Protocol)特点可靠、有连接、面向字节流1.包头特点源/目的端口号表示数据从哪个进程来到哪个进程去32位序号携带本次发送数据的编号32位确认序号填写下一个期望收到的第一个字节的编号该编号之前的数据都已收到4位首部长度表示头部有多少个4字节所以TCP头部最大长度为60字节标注位URG紧急指针是否有效ACK确认号是否有效PSH提示接收端应用程序立刻从TCP缓冲区把数据读走RST对方要求重新建立连接我们把携带RST标识的称为复位报文段SYN请求建立连接我们把携带SYN标识的称为同步报文段FIN通知对方本端要关闭了我们称携带FIN标识的为结束报文段16位窗口大小接收端缓冲区大小用于流量控制16位校验和发送端填充CRC校验。接收端校验不通过则认为数据有问题。16位紧急指针标识哪部分数据是紧急数据2.TCP的可靠性TCP会尽最大努力讲数据发送给对方如果遇到发送不过去的情况TCP会告诉进程发送失败保证不会收到错误的数据保证收到的数据一定是有序的TCP会根据对方的接收能力和网络线路的承载能力进行流量控制实现可靠性的机制确认应答机制数据编号机制超时重传机制、流量控制3.确认应答机制1应答确认应答机制接收方有责任对收到的数据进行确认应答如果同时收到多份数据如何确认应答的是那份数据对数据进行编号——序列号报头中的32位序号部分携带本次发送时数据的编号每个字节占用一个序号序号采用本次发送数据的第一个字节的编号。例如序号从1开始 [abcd] SN 1 [efgh] SN52确认确认段一个数据既可以起到发送数据的角色也可以取到确认的角色。发送携带有数据填写正确的SN就是发送段。确认标志位ack置1代表起到了确认的作用需要填写确认序列号ASN)。确认序列号填写下一个期望收到的第一个字节的编号换言之ASN之前的数据已经全部收到了。例如序号从1开始 发送[abcd] SN1 确认ack1,ASN5发送[efgh] SN 5 ; 确认ack1,ASN9ps发送端和接收段的TCP会维持着各自的发送SN。3超时重传机制当我们发送了一份数据没有收到应答时可能发生了什么对方没有收到 2. 对方收到并且应答了但应答没有发送过来我们不应该无限制等下去超时timeout机制重新发送数据。TCP的发送端不用关心没收到应答的原因是什么统一采用超时重传机制即可。如果接收端真的收到了重复数据直接丢弃即可。这需要接收端根据数据中的序号进行去重操作。超时时间的设置一般这个时间不是一个定长而是逐步变长。例如 在Linux中以500ms为一个单位进行控制每次判定超时重发的超时时间都是500ms的整数倍。500ms — 500ms /* 2 — 500ms /* 4 — 500ms /* 8超时重传具有次数上限达到上限发送方TCP认为本次数据线路出现重大问题。1. TCP关闭本次连接2. TCP会通知进程在Java中采用异常方式IOException3. TCP会发送一个 reset segment出去。作为TCP的发送方经过一段时间之后可以知道线路有问题。作为TCP的接收方无法得到线路有问题无法确定对方没有发送数据还是发送失败。4.连接管理机制3次握手、4次挥手TCP为什么要建立连接1.必须确认对方存在才能”可靠“地传输2.交换一些必要的数据SN不是直接从1开始由双方各自随机生成随后需要交换1三次握手建立连接阶段由于(2)和(3)几乎是同一时间发生的TCP的segment可以既承载发送数据又承载应答功能所以(2)(3)会被合并从标志位的角度看从序列号角度从TCP状态变更角度CLOSED:虚拟状态LISTEN:被动连接方服务器已启动但还未建立连接SYN/_RCVD:收到了syncSYN/_SENT:sync已经发送当双方都处于ESTABLISHED状态时连接建立。TCP连接是全双工的双方地位相等谁都可以通过这条连接发送数据或接收数据。(2)四次挥手主动连接方不一定是主动断开方断开连接中的应答和请求可以合并、也可以不合并所以分为三次挥手、四次回收、同时回收。三次挥手四次挥手同时回收为什么主动关闭方要有TIME/_WITE状态不能直接走到CLOSED1.TCP协议内部通过五元组信息区分连接当一个连接关闭之后如果直接释放则五元组信息可能被再次使用。此时收到发送给这条连接的数据时不知道是发送给旧连接和新连接。2.防止最后一个ACK丢失对方超时重发FIN。当收到重传的FIN时重制2MSL的等待时间。TCP状态转化汇总3异常关闭进程收到一个 reset segment之后TCP直接关闭连接。TCP异常情况进程终止进程 终止会释放文件描述符任然可以发送FIN和正常关闭没有区别。机器重启和进程终止情况相同。机器断电/网线断开接收端认为连接还在一旦接收端有写入操作接收段发现连接已经不在了就会reset。即使没有写入操作TCP自己内置了一个保活定时器会定期询问对方是否还在。一旦对方不在就会释放连接。应用层的某些协议也会有这样的检测机制。例如HTTP长连接中也会定期检测对方的状态。比如QQ断线之后会定期尝试重连。5.流量控制1滑动窗口机制刚才我们讨论了确认应答策略对每一个发送的数据段都要给一个ACK确认应答。收到ACK后再发送下一个数据段。这样做有一个比较大的缺点就是性能较差。尤其是数据往返的时间较长的时候。那么我们一次发送多条数据就可以大大的提高性能其实是将多个段的等待时间重叠在一起了。窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。上图的窗口大小就是4000个字节四个段)发送前四个段的时候不需要等待任何ACK直接发送 收到第一个ACK后滑动窗口向后移动继续发送第五个段的数据依次类推操作系统内核为了维护这个滑动窗口需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答只有确认应答过的数据才能从缓冲区删掉窗口越大则网络的吞吐率就越高那么如果出现了丢包如何进行重传数据包已经抵达ACK被丢了。这种情况下部分ACK丢了并不要紧因为可以通过后续的ACK进行确认数据包就直接丢了。当某一段报文段丢失之后发送端会一直收到 1001 这样的ACK就像是在提醒发送端 “我想要的是 1001” 一样如果发送端主机连续三次收到了同样一个 “1001” 这样的应答就会将对应的数据 1001 -2000 重新发送这个时候接收端收到了 1001 之后再次返回的ACK就是7001了因为2001 - 7000接收端其实之前就已经收到了被放到了接收端操作系统内核的接收缓冲区中这种机制被称为 “高速重发控制”也叫 “快重传”。2流量控制接收端处理数据的速度是有限的。如果发送端发的太快导致接收端的缓冲区被打满这个时候如果发送端继续发送就会造成丢包继而引起丢包重传等等一系列连锁反应。因此TCP支持根据接收端的处理能力来决定发送端的发送速度。这个机制就叫做流量控制FlowControl。接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段通过ACK端通知发送端窗口大小字段越大说明网络的吞吐量越高 接收端一旦发现自己的缓冲区快满了就会将窗口大小设置成一个更小的值通知给发送端发送端接受到这个窗口之后就会减慢自己的发送速度如果接收端缓冲区满了就会将窗口置为0这时发送方不再发送数据但是需要定期发送一个窗口探测数据段使接收端把窗口大小告诉发送端。3拥塞控制虽然TCP有了滑动窗口这个大杀器能够高效可靠的发送大量的数据。但是如果在刚开始阶段就发送大量的数据仍然可能引发问题。如何得知网络承载能力 拥塞窗口拥塞窗口没有一个精确的值只能采用一些算法来推算拥塞窗口这个算法在不断发展中。方法慢开始快增长当TCP开始启动的时候慢启动阈值等于窗口最大值在每次超时重发的时候慢启动阈值会变成原来的一半同时拥塞窗口置回1。发送窗口取拥塞窗口和接收窗口的最小值同样按照滑动窗口机制进行控制。四、IP协议4位版本号version指定IP协议的版本对于IPv4来说就是4。4位头部长度header lengthIP头部的长度是多少个32bit也就是 length /* 4 的字节数。4bit表示最大的数字是15因此IP头部最大长度是60字节。8位服务类型Type Of Service3位优先权字段已经弃用4位TOS字段和1位保留字段必须置为0。4位TOS分别表示最小延时最大吞吐量最高可靠性最小成本。这四者相互冲突只能选择一个。对于ssh/telnet这样的应用程序最小延时比较重要对于 ftp这样的程序最大吞吐量比较重要。16位总长度total lengthIP数据报整体占多少个字节。16位标识id唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了那么每一个片里面的这个id都是相同的。3位标志字段第一位保留保留的意思是现在不用但是还没想好说不定以后要用到。第二位置为1表示禁止分片这时候如果报文长度超过MTUIP模块就会丢弃报文。第三位表示更多分片如果分片了的话最后一个分片置为1其他是0。类似于一个结束标记。13位分片偏移framegament offset是分片相对于原始IP报文开始处的偏移。其实就是 在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 /* 8得到的。因此 除了最后一个报文之外其他报文的长度必须是8的整数倍否则报文就不连续了。8位生存时间Time ToLiveTTL数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由TTL -1一直减到0还没到达那么就丢弃了。这个字段主要是用来防止出 现路由循环。8位协议表示上层协议的类型。16位头部校验和使用CRC进行校验来鉴别头部是否损坏。32位源地址和32位目标地址表示发送端和接收端。五、数据链路层重点协议一以太网帧格式源地址和目的地址是指网卡的硬件地址也叫MAC地址长度是48位是在网卡出厂时固化的帧协议类型字段有三种值分别对应IP、ARP、RARP帧末尾是CRC校验码。二MTUMTU相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层产生的限制。以太网帧中的数据长度规定最小46字节最大1500字节ARP数据包的长度不够46字节要在后面补填充位最大值1500称为以太网的最大传输单元MTU不同的网络类型有不同的MTU如果一个数据包从以太网路由到拨号链路上数据包长度大于拨号链路的MTU了则需要对数据包进行分片fragmentation不同的数据链路层标准的MTU是不同的由于数据链路层MTU的限制对于较大的IP数据包要进行分包。将较大的IP包分成多个小包并给每个小包打上标签每个小包IP协议头的 16位标识id 都是相同的每个小包的IP协议头的3位标志字段中第2位置为0表示允许分片第3位来表示结束标记当前是否是最后一个小包是的话置为1否则置为0到达对端时再将这些小包会按顺序重组拼装到一起返回给传输层一旦这些小包中任意一个小包丢失接收端的重组就会失败。但是IP层不会负责重新传输数据MTU对于TCP协议的影响:TCP的一个数据报也不能无限大还是受制于MTU。TCP的单个数据报的最大消息长度称为MSSMax Segment SizeTCP在建立连接的过程中通信双方会进行MSS协商;最理想的情况下MSS的值正好是在IP不会被分片处理的最大长度这个长度仍然是受制于数据链路层的MTU;双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值;然后双方得知对方的MSS值之后选择较小的作为最终MSS;MSS的值就是在TCP首部的40字节变长选项中kind2三ARP协议ARP协议建立了主机 IP地址 和 MAC地址 的映射关系。在网络通讯时源主机的应用程序知道目的主机的IP地址和端口号却不知道目的主机的硬件地址数据包首先是被网卡接收到再去处理上层协议的如果接收到的数据包的硬件地址与本机不符则直接丢弃因此在通讯前必须获得目的主机的硬件地址《网络安全从零到精通全套学习大礼包》96节从入门到精通的全套视频教程免费领取如果你也想通过学网络安全技术去帮助就业和转行我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。网络安全学习路线图想要学习 网络安全作为新手一定要先按照路线图学习方向不对努力白费。对于从来没有接触过网络安全的同学我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线大家跟着这个路线图学习准没错。配套实战项目/源码所有视频教程所涉及的实战项目和项目源码学习电子书籍学习网络安全必看的书籍和文章的PDF市面上网络安全书籍确实太多了这些是我精选出来的面试真题/经验以上资料如何领取n/direct/5458f21c6efa4e739621ffb5d4309b20.jpeg#pic_center)面试真题/经验以上资料如何领取