网络基础总结

                                 计算机网络背景

网络发展
独立模式:计算机之间相互独立;
网络互联:多台计算机连接在一起,完成数据共享;
局域网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%2B%2B&”,其中“+”被转义为“%2B”
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数据报产生分包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值