网络基础总结

it2022-05-05  210

计算机网络背景

网络发展 独立模式:计算机之间相互独立; 网络互联:多台计算机连接在一起,完成数据共享; 局域网LAN:将计算机通过交换机和路由器连接在一起; 广域网WAN:将远隔千里发计算机都连在一起; 城域网MAN:在一个城市范围内建立的计算机通信网;

认识“协议”: 两台主机通信之间相互“约定的格式”。 计算机之间的传输媒介是光信号和电信号。通过“频率”和“强弱”来表示0和1这样的 信息。要想传递各种不同的信息,就需要约定好双方的数据格式。

初识网络协议 协议分层:将网络通信分成不同层次处理 协议分层的好处: 1.封装 2.解耦(高内聚,低耦合)

OSI七层模型: TCP/IP五层(或四层)模型:

很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发);

对比两种协议的对应关系:

网络传输基本流程 同一个网段内的两台主机进行文件传输

应用层 HTTP/HTTP/HTTPS/FTP/SSH 应用程序相关 传输层 UDP/TCP 网络层 IP 操作系统内核 数据链路层 以太网 物理层 以太网 硬件和驱动程序负责

重点:应用层与传输层 两台计算机通过TCP/IP协议通信时遵守对应协议

数据包封装和分用 数据包:在每层名字不同(数据包----数据段----数据报-----数据帧) 封装:上层协议将数据交给下层协议,打上包装,加上一个数据首部 分用:下层协议将数据分解析出来,交给上层协议

自定制协议 1.约定好客户端请求(request)包含什么信息,服务器响应(response)包含什么信息 2.约定数据的格式,本质上互联网传输的都是(二进制)字符串(序列化\反序列化)

应用层 应用层和应用程序直接相关,这部分是和程序员打交道最多的地方。 HTTP协议 HTTP/HTTPS:超文本传输协议,当前使用最广泛的应用层协议 HTTPS:多了一层加密

认识URL 网址可称为URL

urlencode/urldecode转义: 若参数中含有"/""?“这种url特殊字符,就要进行转义,如我们常见的"c++&”,其中“+”被转义为“+” DNS域名解析: 域名转换成IP地址的过程(8.8.8.8/114.114.114.114)。 Fiddler抓包工具:查看完整的HTTP请求和响应数据

HTTP的常用方法 1.get :获取资源 2.post:传输实体主体 get与post 的区别: get请求通常是把数据通过query_string来传输; post通常是把数据通过body来传递。 但是登录的时候多半会用post请求,它不会将用户名和密码明文放在url上。 但通过抓包工具就可以轻松将用户名和密码抓出来。

HTTP状态码 1 x x (临时响应):接收的请求正在处理 2 x x (成功) 3 x x (已重定向):需要进行附加操作以完成请求 301 永久重定向 302 临时重定向 4 x x (请求错误):服务器无法处理请求 404 找不到网页 403 已禁止 401 未授权 400 请求失败,服务器不理解请求语法 418 是一个彩蛋:“I’m a twapot” 5 x x (错误状态):服务器处理请求出错

HTTP协议中常见的header(键值对) Content-Type: 数据类型(text/html等) Content-Length: Body的长度(字节) Host: 客户端告知服务器,所请求的资源是在哪个主机的端口上 User-Agent: 表示操作系统和浏览器的型号。 Referer: 表示当前页面是从哪个页面跳转过来的 location: 搭配3xx状态码使用,告诉客户端接下来要去哪里访问 Cookie: 浏览器存储数据的一种重要方式。里面的具体内容都是由对应产品的程序员自行决定的。但是一般这里面包含了用户身份标识,可能存放session id(会话id)

Cookie和Session之间的理解 Cookie只是浏览器存储数据的 一种方式(客户端概念) Session是服务器进行描述用户身份信息的方式(服务器端概念) 实现Session机制的过程中(程序员手动实现),通常要把Session id放在cookie中保存。

传输层

传输层关注的是起点和终点 传输层TCP/UDP 相同点 UDP 与TCP都是全双工 全双工:可以同时进行信号的双向传输。指A–>B的同时B–>A,是瞬时同步的。 不同点 UDP是一个比较简单的协议(通信效率更高一些) 1.无连接 2.不可靠 3.面向数据报 TCP是一个比较复杂的协议 1.有连接 2.可靠传输 (发送者能感知到失败) 3.面向字节流

UDP协议 UDP协议格式 端口号传输层: 区分这个数据要交给那个程序来处理(HTTP默认端口号为80) UDP的报文长度: 最多16位(64k),这是一个较小的数字 限制了应用层协议的数据长度,一旦数据长度超出了UDP的表示范围,就会出现问题 可以在应用层通过代码把应用数据拆分成多个数据报,在使用多个UDP数据报来分别发送 UDP校验和: 比较简短,同时最好能和内容相关联 UDP中使用的是CRC循环冗余校验的方式 uint16_t checksum = 0 for(一次遍历数据包的每个字节){ checksum += 当前字节的值 }

发送者在发送之前先计算了一个校验和checksum1并把数据和checksum1 一起发送到对端 接收端也按照相同的规则计算校验和checksum2. 对比checksum1与checksum2是否相同

基于UDP的应用层协议 NFS: 网络文件系统 TFTP: 简单文件传输协议 DHCP: 动态主机配置协议 BOOTP: 启动协议(用于无盘设备启动) DNS: 域名解析协议

TCP协议 TCP最核心机制 1.可靠传输 2.尽量提高传输效率

TCP相关机制 TCP的相关机制有很多,都是围绕上述两点展开的: 可靠性(主)---->确认应答/超时重传/连接管理 传输效率(次)---->滑动窗口/快速重传 ---->流量控制 (延时应答 / 捎带应答) ---->拥塞控制 一.确认应答(可靠性的核心机制) 对于序号来说,按照每个字节的方式来编号的 确认序号来说,表示当前序号之前的数据已经正确收到 接下来对端应该给我发送确认序号开始的数据

二.超时重传(可靠性的核心机制)和确认应答相辅相成 如果对方没有确认应答,此时隔一定时间之后,就需要重复传输此数据 重传是为了进一步的降低丢包的可能性 重传的间隔时间采取的是一种比较悲观的态度,等待时间越来越长 如果达到一定的次数之后对方还没有响应,就断开和对方通信的连接。 如果是是应答数据包丢失(ACK),同样会超时重传,此时就导致接收方收到了两份相同的数据。TCP会根据序号来自动去重

三.连接管理(也是可靠性的一部分) 建立连接的意义: 1.双方先试探下对方是否适合和我进行通信 2.双方可以协商一些重要的数据 序号从几号开始

四.滑动窗口(提高传输效率) 窗口的含义是:不等待ACK的情况下最多发多少数据 滑动的含义:每次收到ACK数据的同时,就继续往后发下一组数据 如果窗口越大,传输效率越高 窗口也不能无限大,如果窗口太大可能会影响到可靠性 滑动窗口中如果丢包,采用快速重传的方式来进行重传 快速重传本质上就是超时重传,只不过,重传的时候没有拖泥带水,只重传了真正丢包的数据

五.流量控制 窗口越大,传输效率越高,但是窗口也不能无限大。如果窗口太大,可能接收端,处理不过来 如果生产速度超过了消费速度,接收缓冲区的内容就会越积越多,达到一定程度缓冲区满了,此时在传输的数据就会丢包 使用接收缓冲区空间大小这个指标衡量接收端的处理能力,来控制发送端的窗口大小(发送速度) 接收端的缓冲区空余空间大小,作为TCP协议报头中的窗口大小,这个值就是发送端的滑动窗口大小的一个“建议值”

六.拥塞控制 滑动窗口的窗口大小不能无限大,即使接收端处理速度很快,也可能因为网络环境不佳导致数据丢包。 最终的滑动窗口大小是由 流量控制 和 拥塞控制 共同决定的,最终结果为两者的较小值 拥塞窗口:拥塞控制机制所建议的窗口大小,从一个比较小的数字开始,如果网络畅通,放大窗口大小,如果网络丢包,缩小窗口大小 慢开始:刚开始传输的时候拥塞窗口设置的小一些。

七.延时应答(提高传输效率) 在可靠性的基础上,尽量提高窗口大小。 也是和滑动窗口以及流量控制相关 流量控制中需要在ACK中反馈接受接受缓冲区剩余空间的大小。此时采用的策略是,收到数据不立刻返回ACK,而是等一会。等的过程中,程序就能消费一些缓冲区中的数据,从而导致反馈的窗口大小就要更大一些。

八.捎带应答(提高传输效率) 建立在延时应答的基础上的 内核反馈ACK的实际和程序反馈响应的时机合二为一。通过同一个数据报同时带上两方面的信息。

九.面向字节流 写入数据和读取数据时可以调用多个方法同时进行,也可以调用多次方法多次完成 粘包问题 由于面向字节流读取数据方式没有具体的约定,很难从接收缓存区中直接获取到一个完整的应用层数据包 解决粘包问题只能从应用层角度入手 只要在应用层协议设定的时候,明确包的边界就可以了 1.指定分隔符 2.指定包的长度

十.异常情况 1.程序异常结束(没有影响,四次挥手正常完成) 2.系统关机(没有影响,先强制关闭所有程序) 3.主机掉电/拔网线(有影响) a)掉电的是接收方,发送方会触发超时重传,尝试重新建立连接,彻底释放连接 b)掉电的是发送方,接收方如果一直收不到数据的话,达到一定时间之后,就会给对方发送一个“心跳包”,如果没有心跳了,就会重新尝试建立连接,如果连接建立失败,彻底释放连接。

三次握手建立连接,四次挥手断开连接 三次握手 SYN:同步报文段,由操作系统内核发送 ACK:确认报文段,由操作系统内核发送

三次握手涉及到的状态变化: 1.LISTEN状态(服务器):手机开机,且信号良好 2.ESTABLISHED状态(客户端/服务器):电话拨通且对方接听了

四次挥手 四次挥手的过程:

ACK是由内核控制 FIN是由用户代码控制的,执行到socket对象的关闭方法的时候,才会发送FIN 双方各自向对方发送FIN,再各自向对方发送ACK,中间的两次交换,可能合并成一个 中间件:一些特定功能的服务器,这些服务器程序和业务无关,数据库就可以理解为一种中间件 消息队列(服务器):一种特殊的队列,不是严格的先进先出,引入了“类型”概念

四次挥手的状态转换: 1.CLOSE_WAIT:收到第一个FIN的一方进入LIOSE_WAIT,是为了等待代码中调用 关闭 方法 如果你发现服务器上出现大量的CLOSE_WAIT状态,意味着代码有bug,忘记调用close方法了 2.TIME_WAIT:主动断开连接的一方进入TIME_WAIT状态,存在的意义是为了一旦最后一个ACK丢包,还有机会进行重传 TIME_WAIT会存在一定的时间,在超出这个时间(2MSL)之后,TIME_WAIT状态才会真正消失,释放对应的连接 MSL表示互联网上任何两点之间传输数据的最大时间。1min

TCP与UDP的对比 1.如果需要使用可靠传输,优先考虑TCP 2.如果传输的单个数据报比较大,还是考虑TCP 3.如果对可靠性要求没那么高,但是对性能,要求很高,优先考虑UDP 4.如果需要实现广播,优先考虑UDP

面试题:如何使用UDP来完成可靠传输? 只能在应用层通过代码来手动实现(TCP超时重传,序列号,确认号,滑动窗口)每一层关系

网络层

网络层负责规划出一条或多条从起点到终点的路线 IP协议(物流公司) 1.地址管理 IP地址:通过一个整数来表示一个地址,使用点分十进制来表示(192.168.1.100) IPV4:一个IP地址是一个32位的整数 IP地址不够用的问题: a)动态分配IP 某个主机上网,就分配IP,不上网,就不分配 b)NAT机制,很多主机共用同一个IP地址路由器(NAT设备根据端口号来进一步区分数据交给那个主机) c)IPV6彻底解决问题 网段划分:IP地址的前半部分划分成网络号,后半部分划分成主机号 网段划分是为了组建不同的局域网,路由器来链接不同的局域网。同一个局域网中的若干设备,网络号相同,但是主机号不相同 子网掩码:/24表示子网掩码 子网掩码也是一个32位的整数,前半部分都是1后半部分都是0 网络号:子网掩码按位与上IP地址 特殊的IP: 将IP地址中的主机地址全部设为0,就成了网络号,代表这个局域网; 将IP地址中的主机地址全部设为1,就是广播地址,用于给同一个链路中相互连接的所有主机发送数据包; 本机环回(loop back)测试:用127.*的IP地址来测,通常是127.0.0.1;(表自己)

2.路由选择 相当于地图软件的导航功能

数据链路层

数据链路层更关注两个相邻节点之间如何传输数据 ARP协议:IP地址 —>MAC地址之间的转换 MTU:一个数据链路层的数据帧所搭载的数据最大长度 以太网的MTU1500字节 对于IP协议的影响:会导致IP数据报产生分包


最新回复(0)