)
一、传输层传输层协议TCP有连接可靠传输面向字节流全双工UDP无连接不可靠传输面向数据报全双工连接虚拟连接双方保存对方信息可靠传输尽可能提高传输成功率能感知到丢包不可靠传输只发送数据不管其他面向字节流读写数据以字节为单位面向数据报读写数据以数据报为单位全双工一个通信链路支持双向通信能读能写半双工一个通信链路只支持单向通信能读或者能写1.UDP协议报文格式长度表示整个UDP数据报长度报头载荷长度属性是两个字节表示范围是0-6553564kb当长度不足有两种方案 1.应用层代码进行拆包处理一个大的应用层广告数据包拆分成为多个小包使用多个UDP数据报传输 工作量 较大复杂 2.使用TCP协议没有数据包限制长度最优选择校验和验证数据是否发生修改这里与HTTPS的数字签名不同其是防止黑客篡改这里UDP的校验和为了防止由于光信号电信号电磁波等外界因素引起的比特翻转1和0的转换 验证方式发送前算一次把校验和和数据一起发送收到后再算一次和之前的校验和比较2.TCP报头1.16位的源端口目的端口是传输层的核心内容2.数据偏移4位首长度TCP 报头长度可变固定 20 字节 可选选项接收方通过该字段知道报头结束、数据开始的位置。3.保留字段TCP报头提前预留的位置长度不够可以扩展4.核心的6个标志位TCP核心机制1.可靠性网络通信非常复杂TCP的可靠性可以尽可能使得数据被完整收到完成可靠性的两个最核心机制1确认应答发送数据后接收方返回一个应答报文acknowledge, ack),发送方就知道对方收到数据了应答报文会把标志位ACK改为1触发问题后发先至发送多次数据返回多次应答但是由于网络路由不可靠后发的数据的应答报文先到)解决方案1.发送方编序号发送方把TCP数据1-1000字节的第一个字节(1)存入到32位序号2.接收方排序接收方收到后在内核接收缓存区按照序号进行排序保证应用层拿到完整有序的字节流3.确认序号返回应答报文时将最后一个字节加一(1001)存入到确认序号里面表示小于1001数据已经收到接下来从1001开始发送4.当内核将N个tcp数据全部收到之后重组为字节流最后read将数据给应用层读取。2超时重传针对丢包问题的机制因为网络结构非常复杂路由器、交换机内部有接收 / 转发缓冲区队列用来缓存还没来得及转发的数据包。 当流量突增设备处理不过来队列被打满新到来的数据包没有地方存放而且数据包有实效性就只能直接丢弃这个叫队列溢出丢包。但是丢包概率很低。那发送方如何找到我发送的数据报丢包了引入超时时间当过了时间上限没有收到ack就可以认为丢包。超时的时间不是固定的当发生超时就会延长超时时间但不是无限延长超过一定程度就会认为网络严重故障放弃这次传输。没收到ack两情况1.发送的数据丢了2.返回的ack丢了那接收方会不会收到两次一模一样的数据不会因为接收方收到后在内核接收缓存区按照序号进行排序如果重复会丢弃核心机制3连接管理连接通信双方保存对方的信息三次握手建立连接A通过同步报文将自己的信息发给BB再将自己的信息发给A同时一起发送应答报文ack表示自己收到了A的信息提高了效率最后A再发送一个应答报文ack表示A收到了B的信息三次握手的作用1.初步探测网络是否通畅2.验证通信双方发送接收能力是否正常3.三次握手可以协商一些关键信息例如协商通信过程初始序号是多少通过判断序号第二次连接收到第一次连接的数据包可以通过序号区分出来从而不进行处理防止历史连接错误建立。四次挥手断开连接与三次握手不同的是三次握手一定是客户端发起的但是四次挥手客户端和服务器都可以发起三次握手的syn和ack可以合并但是四次挥手FIN和ack不能合并因为内核收到FIN第一时间就返回ack但是第二个FIN是由代码调用scoket.close才触发两者可能时机不一致主动发起的一方进入TIME_WAIT被动一方进入CLOSED_WAIT如果B给A返回一个FINA收到了但是A返回的ACK丢包A会等一定的时间网络任何两个节点传输过程消耗最大的时间2*MSLB 迟迟收不到 ACK触发 B 侧的超时计时器B 判定自己的 FIN 没有得到确认B 重新发送 FIN 报文。核心机制4滑动窗口滑动窗口可以在保证可靠性同时提高效率滑动窗口中丢包1.数据报抵达但是ack丢了数据1-1000的ack丢了但是1001-2000的ack到了,返回的ack表明下一个是2001就不用在意之前丢的ack后面的ack直接覆盖前面ack2.数据包丢了数据1001-2000没有收到无论发什么数据返回的ack都是表明下一个是1001主机A就会进行快速重传主机B收到后确认序号就变成了7001表示之前的数据都收到了下一个从7001开始发送快速重传传输数据多使用构成滑动窗口形式传输超时重传传输数据少使用没有构成滑动窗口形式传输以上措施表明虽然滑动窗口可以增加传输效率但是依然是在可靠性的基础上核心机制5流量控制滑动窗口窗口大固然效率高但窗口过大就会影响可靠性因为接收方的处理能力是有限的接受方将接收缓冲区的剩余空间大小填入窗口属性发送方就通过这个数字重新设定发送窗口大小即滑动窗口大小是动态变化的窗口探测包探测缓冲区的大小核心机制6拥塞控制发送数据的时候不仅仅是接受方处理能力有限制传输链路的转发能力也有限制我们通过先按照小窗口发数据包发送如果顺利不丢包就加大速度出现丢包就减小速度又不丢又加大速度丢了又减小实现动态平衡即拥塞控制。滑动窗口大小拥塞控制和流量控制哪个值较小就按照哪个值进行发送核心机制7延时应答默认情况下都是接收到数据第一时间返回ack但是也可以通过延迟ack的方式提高效率不能一定提高效率主要看应用程序消耗数据的速度所有包都可以延时应答吗no数量限制每隔几个包就延时应答一次数据密集情况时间限制超过最大延迟时间就应答一次数据稀疏情况核心机制8捎带应答普通模式:1.服务器收到请求后先返回一个ack确认收到了数据2.服务器处理业务生成响应数据再单独发送一个包含响应的报文基于上面的延时应答可以引入捎带应答ack被延迟发送后正好要返回业务数据就一起合成一个包将ack设置为1窗口大小设置为接收缓冲区剩余值确认序号设置合适值...都是报头的内容与响应数据不影响返回客户端核心机制9面向字节流粘包问题通过字节流方式传输会混淆包与包之间的边界无法区分从哪里到哪里是一个完整的数据包1.约定包与包之间的分隔符包的结束标志在包的结尾加一个唯一不会出现在数据的分隔符\n2.约定包的长度包头包体在包的最开头用固定长度字节如4个字节记录包的总长度核心机制10异常情况处理1.某个进程崩溃进程崩溃和主动退出没有本质区别进程释放回收文件描述符表表的每个资源调用socket的close,FIN触发四次挥手进程没了TCP连接还在此时四次挥手正常进行。2.主机关机正常关机有一定的时间这段时间会杀死所有用户进程这时间正常可以进行完四次挥手如果没有挥手完会重传也没有ACK就会认为对面出现问题B主动放弃与A的连接3.主机掉电A突然掉电B发过来的数据就没有ACK对于B超时重传继续重传不能解决问题到一定次数就会触发重置TCP连接。即B发送一个复位报文RST如果RST也没有ackB就会单方面释放连接B突然发现A没有发送数据区分不了A具体是在休息还是挂了就会发送一个特殊的报文“心跳包”不携带业务数据载荷只是为了触发ACK没有心跳就认为对方挂了4.网线断开TCP机制的思路可靠性出发-效率-可靠性-效率-特殊情况处理其他标志位URG紧急指针位TCP正常来说是按照序号发送和接收相当于插队PSH催促标志位发送方给接收方的数据带有这个标志位。接收方就会尽快将这个数据read到应用程序。TCP和UDP对比TCP:可靠传输大部分情况优先使用TCPUDP效率更高对性能要求高可靠性要求不高二、网络层IP协议主要功能1.地址管理使用IP地址标识网络上的某个设备2.路由选择在两个通信节点之间规划出一个合理的路径IP数据报头部结构4位版本IPv4,IPv64位首部长度IP协议的报头也是变长单位都是4字节8位服务类型决定IP协议的工作方式主要的四种工作方式最小延时最大吞吐量最高可靠性最小成本16位总长度字节数一个IP数据报报头载荷长度16位标识拆包把拆出来的多个包设置为相同标识组包把相同标识的数据包组合在一起3位标识其中一个标志位表示是否触发了拆包操作还有一个表示当前包是否是最后一个13位片偏移描述先后顺序偏移小的放在前面大的放在后面8位服务类型4种主要服务类型分别最小延时最大吞吐量最高可靠性最小成本这四者相互冲突只能选择一个。8位生存空间一个IP数据报能够在网络传输的最大时间次数为单位每次经过一个路由器转发一次就减去1减到0就说明包到不了要丢弃8位协议标识传输层使用哪种协议16位首部校验和仅校验 IP 头数据部分的校验由 TCP/UDP 等上层协议负责路由器转发时会重新计算该字段因 TTL 变化。32位源IP地址32位目的IP地址最关键部分地址管理-IP分配方式1.动态分配上网分配不上网就不分配2.NAT机制网络地址转换最主要的方式 把IP分为两个大类1.公网IP/外网IP公网IP是唯一的2.私网IP/内网IP私网在不同局域网可以重复机制一个外网的IP可以对应局域网的所有设备通过每个设备的不同的私网又可以区分具体的设备NAT背景下网络通信如何进行1.同一个局域网设备A访问设备B由于IP不允许重复也不收到影响NAT不起到作用2.公网设备A访问公网设备B由于公网IP本身也不重复不受到影响NAT不起作用3.不同局域网设备A访问设备B不允许NAT机制禁止这样访问方式4.局域网设备A访问公网B5.公网设备A不允许访问公网设备BNAT路由器通过给每个内网连接分配唯一的公网端口建立“公网IP:端口 ↔ 内网IP:端口”的映射表服务器返回响应时路由器就根据目标端口把响应转发给正确的内网主机。端口号是传输层TCP/UDP的核心标识核心作用是区分同一主机上的不同应用进程一台主机可以同时运行多个网络应用如微信、浏览器、游戏端口号用来标记数据属于哪个应用。NAT 场景下区分内网设备在你刚才的 PAT端口地址转换场景中路由器通过「公网 IP 端口号」 的唯一组合在收到服务器响应时精准找到对应的内网设备和应用进程完成数据转发。IP地址其他规则网段划分把一个ip地址分为两个部分前面部分为“网络号”后半部分为“主机号”且同一个就局域网中网络号必须相同主机号必须不同不同局域网中网络号必须不同主机号无限制。子网掩码掩码的1对应IP地址部分属于网络号掩码的0对应IP地址部分属于主机号以此区分网络号与主机号。特殊的IP地址主机地址全部设置为0就成为了网络号代表这个局域网主机地址全部设置为1就成为了广ip播地址用于给同一个链路中相互连接的所有主机发送数据报。127.*的ip地址用于本机环回测试通常是127.0.0.1实际组网中习惯以主机号为1的ip作为网关IP网络的入口/出口路由选择-通过ip协议进行数据转发的过程网络情况非常复杂每个路由器不可能存储所有的网络信息但是每个路由器可以存储附近的网络情况。当数据包到达某个路由器就会匹配这个路由器的路由表记录这个路由器周围设备的ip以及记录每个设备从哪个口转发过去1.如果目的IP刚好匹配到路由表的记录直接按照当前的对应口转发2.如果没有找到路由表有特殊选项“下一跳”指向的设备为上一级路由器所在位置三、数据链路层以太网协议此处地址不是ip地址是mac地址物理地址类型类型不同载荷数据格式不同桢尾校验和载荷部分MTU最大传输单元是1500字节而IP数据报理论最大长度为64kb,65536字节,所以因为数据链路层的限制对IP数据报进行拆包ARP不是传输业务数据而是辅助的网络层协议可以根据下一跳的ip地址得到当前网络可用的mac地址让数据能够传递出去。IPMACARP 是怎么配合的前提信息主机 AIP 192.168.1.10MAC AA:AA:AA:AA:AA:AA路由器网关IP 192.168.1.1MAC GG:GG:GG:GG:GG:GG外网服务器 CIP 100.100.100.100MAC CC:CC:CC:CC:CC:CC在另一个网络里1.主机A构造ip数据包源IP192.168.1.10目的IP100.100.100.100主机A根据路由表发现当前网段没有匹配的所以选择下一跳路由器网关2. 主机 A 发送ARP 数据报拿到网关的 MAC 地址发送ARP广播请求拿到GG:GG:GG:GG:GG:GG3.主机A拿到mac地址成功构造以太网帧发送给网关4.路由器网关去掉以太网头得到IP包得到目的IP100.100.100.100路由器查路由表找到通往目标网段的下一跳地址。5.路由器网关构造ip数据包源IP192.168.1.1目的IP100.100.100.1006.每经过一个路由器进行三件事拆帧看目的IP查路由找下一跳ARP拿下下一跳ARP拿下MAC重新封装帧发走7.最后一台路由器网关发送ARP数据报拿到服务器C的mac发送ARP广播请求拿到CC:CC:CC:CC:CC:CC8.路由器网关拿到mac地址成功构造以太网帧发送给服务器c9. 服务器C收到数据解封装后取出IP数据包看到源IP是 192.168.1.10 然后按原路返回响应。DNS应用层协议也可以认为是域名解析系统把域名一串单词自动把这串单词翻译成IP地址1.最初DNS是通过hosts文件实现映射但是hosts文件维护太复杂2.访问某网站时候先访问DNS服务器找到域名对应的ip,再访问真正的服务器。但是如果每次发送网络请求都要先访问DNS服务器那DNS服务器会不会挂?1.电脑进行一次DNS后就把ip存下来:缓存2.DNS服务器不止一个存储原始数据为根服务器各种网络运营商可搭建DNS镜像服务器。