网络模型
OSI七层
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP四层
应用层(application-layer)
负责应用程序间沟通。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的 HTTP协议,支持电子邮件的 SMTP协议,文件传输协议FTP,网络远程访问协议TELNET等等。我们把应用层交互的数据单元称为报文。网络编程主要就是针对应用层。
传输层(transport layer)
运输层的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
运输层主要使用以下两种协议:
- 传输控制协议 TCP(Transmisson Control Protocol)–提供面向连接的,可靠的数据传输服务。
- 用户数据协议 UDP(User Datagram Protocol)–提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
网络层(network layer)
负责地址管理和路由选择。路由器(Router)工作在网络层
数据链路层(data link layer)
通常简称为链路层,负责设备之间数据帧的传送和识别,交换机(Switch)工作在数据链路层
物理层(physical layer)
负责光/电信号的传递方式,物理层的能力决定了最大传输速率、传输距离、抗干扰性等,集线器(Hub)工作在物理层
数据包的封装和分用
- 不同协议层对数据包的不同称谓:传输层叫段,网络层叫数据报,链路层叫帧
- 封装:应用层数据通过协议栈每层都要加上一个数据首部,数据首部包含首部有多长、载荷有多长、上层协议是什么等信息
- 分用:数据封装成帧后发送到传输层介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的“上层协议字段”将数据交给对应的上层协议处理
IP地址&MAC地址
- IP地址(IPv4):在IP协议中,用来表示网络中不用主机的地址
- 4字节32位整数,用点分十进制表示(192.168.0.1)
- MAC地址用来表示数据链路层中相连的节点,在网卡出厂时就已确定,不能修改
- 6字节48位整数,一般用16进制数字加冒号的形式来表示(08:00:27:03:fb:19)
应用层
套接字:用于唯一的标识一个网络中的进程,套接字=IP地址+端口号
HTTP
- HTTP是一种无状态的协议。HTTP协议自身不对请求和响应之间的通信状态进行保存,也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理
- 正是基于无状态的特点,需要实现保持状态的功能就引进了Cookie技术
- 一次HTTP通信
在使用浏览器浏览一个包含多张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求该HTML页面里包含的其他资源。因此,每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销
HTTP报文
HTTP的状态码
HTTP和HTTPS的区别
- 端口 :HTTP的URL由“http://”起始且默认使用端口80,而HTTPS的URL由“https://”起始且默认使用端口443。
- 安全性和资源消耗: HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS 运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS高,但是 HTTPS 比HTTP耗费更多服务器资源。
- 对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等;
- 非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。
HTTP的缺点:
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
通信加密
- 通信的加密
HTTP协议中没有加密机制,但可以通过和SSL(Secure Socket Layer, 安全套接层)或TLS(Transport Layer Security,安全层传输协议)的组合使用,加密HTTP的通信内容。与SSL组合使用的HTTP被称为HTTPS(HTTP Secure, 超文本传输安全协议)或HTTP over SSL。
- 内容的加密
HTTPS(HTTP + 加密 + 认证 + 完整性保护)
HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。
通常,HTTP直接和TCP通信,当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信。
两个问题:
有效载荷与报头如何分离?
答:空行
如何根据报头确定将有效载荷交给谁?
答:请求报头中请求行的URL
DNS(Domain Name System)
DNS是一套从域名映射到IP的系统
传输层
端口号
端口号标识了一个主机上进行通信的不同的应用程序
UDP
特点: 无连接、不可靠、面向数据报
面向数据报: 应用层交给UDP多长的报文,UDP原样发送,既不会拆分、也不会合并,但是UDP协议首部中的16位UDP长度,限制了UDP能传输的最大长度是64K(包括UDP首部),如果需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装
基于UDP的应用层协议:
- NFS:网络文件系统
- TFTP:简单文件传输协议
- DHCP:动态主机配置协议
- BOOTP:启动协议(用于无盘设备启动)
- DNS:域名解析协议
两个问题:
有效载荷与报头如何分离?
答:定长首部
如何根据报头确定将有效载荷交给谁?
答:16位目的端口号
TCP(Transmission Control Protocol)
- 源/目的端口号:表示数据是从哪个进程来,到哪个进程去
- 32位序号/32位确认号
- 4位TCP报头长度:表示该TCP头部有多少个32位bit,所以TCP头部最大长度是15* 4=60字节
- 6位标志位:
- URG:紧急指针是否有效
- ACK:确认号是否有效
- PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
- RST:对方要求重新建立连接,我们把携带RST标识的称为复位报文段
- SYN:请求建立连接,我们把携带SYN标识的称为同步报文段
- FIN:通知对方,本端要关闭,我们把携带FIN标识的称为结束报文段
- 16位窗口大小:
- 16位校验和:发送端填充,CRC校验,接收端校验不通过,则认为数据有问题,此处的校验和不光包含TCP首部,也包含TCP数据部分
- 16位紧急指针:标识哪部分数据是紧急数据
确认应答(ACK)机制
每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据,下一次你从哪里开始发,确认序列号保证了数据按序到达
超时重传机制
如果主机A在一个规定的时间间隔内没有收到B发来的确认应答,就会重发,如果是数据丢失重传不会带来任何问题,如果是ACK丢失,重传将会造成B收到重复数据,此时根据序列号可以很容易做到去重的效果
连接管理机制(三次握手 + 四次挥手)
三次握手
四次挥手
滑动窗口
为了提高发送效率,无需等待ACK,一次发送多条数据,窗口的大小确定了无需等待确认应答可以继续发送数据的最大值
操作系统内核为了维护滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答;只有确认应答过的数据,才能从缓冲区删除
快重传:超时重传保证了只发一个数据时的可靠性,快重传提高了超时重传的效率
流量控制
TCP根据接收端的处理能力,来决定发送端的发送速度,这个机制就叫做流量控制
接收端将自己可以接收的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK端通知发送端。接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端。发送端接收到这个窗口之后,就会减慢自己的发送速度,如果接收端缓冲区满了,就会将窗口置为0,这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端
窗口的大小由TCP首部中的16位窗口字段值和窗口扩大因子M共同决定
拥塞控制
发送开始的时候定义拥塞窗口大小为1,每次收到一个ACK应答,拥塞窗口加1,每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小做比较,取较小的值作为实际发送的窗口
延迟应答
如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小,但实际上处理端的处理速度可能很快,如果接收端稍微等一会儿再应答,返回的窗口大小就会大很多
捎带应答
服务器返回的ACK可以夹在发送的数据中一起回给客户端
两个问题:
有效载荷与报头如何分离?
答:首部中的4位首部长度
如何根据报头确定将有效载荷交给谁?
答:16位目的端口号
TCP小结
保证可靠性:
- 校验和
- 序列号(按序到达、去重、快重传)
- 确认应答
- 超时重传
- 连接管理
- 流量控制
- 拥塞控制
提高性能
- 滑动窗口
- 快重传
- 延迟应答
- 捎带应答
基于TCP的应用层协议
- HTTP
- HTTPS
- SSH
- Telnet
- FTP
- SMTP
TCP和UDP对比
- TCP用于可靠传输的情况,应用于文件传输,重要状态更新等场景
- UDP用于对高速传输和实时性要求较高的通信领域,例如,视频直播
网络层
IP地址 = 网络号 + 主机号
IP地址解决端到端的问题;MAC地址解决点到点的问题
IP协议
- 4位版本号:指定IP协议的版本,对于IPv4来说就是4
- 4位首部长度:表示IP头部长度是多少个32bit,也就是length * 4个字节数,4位标识的最大数字是15,所以IP头部最大长度是60字节
- 8位服务类型
- 16位总长度:IP数据报整体占多少字节
- 16位标识(ID):唯一的标识主机发送的报文,如果IP报文在数据链路层被分片,那么每一个片里面的ID相同
- 3位标志字段:第一位保留,第二位置为1标识禁止分片,这时如果报文长度超过MTU(MAC地址规定的最大传输单元,通常为1500字节),IP模块就会丢失报文,第三位表示“更多分片”,如果分片了的话,最后一个分片置为1,其它为0,类似于一个结束标志位
- 13位分片偏移:是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置,实际偏移的字节数就是这个值 * 8得到的,因此除了最后一个报文以外,其它报文的长度必须是8的整数倍,否则报文就不连续了
- 8位生存时间:数据报到达目的地址的最大报文跳数,一般是64,每经过一个路由,TTL的值减1,一直减到0还没到达就丢弃,主要是为了防止出现路由循环
- 8位协议:表示上层协议类型
- 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏
- 32位源地址和目标地址:表示发送端和接收端
网段划分
IP地址 = 网络号 + 主机号
网络号:保证相互连接的两个网段具有不同的标识
主机号:同一网段内,主机之间具有相同的网络号,但是必须由不同的主机号
原始五类IP地址划分:
A类:0.0.0.0~127.255.255.255
B类:128.0.0.0~191.255.255.255
C类:192.0.0.0~223.255.255.255
D类:224.0.0.0~239.255.255.255
E类:240.0.0.0~247.255.255.255
CIDR(Classless Interdomain Routing)划分
将IP地址和子网掩码进行“按位与”操作,得到的结果就是网络号
主机号全0代表该网段的网络号
主机号全1代表该网段的广播号,用于给同一个链路中相互连接的所有主机发送数据包
NAT技术
子网内的主机需要和外网进行通信,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址成为了一个公网IP,这种技术称为NAT(Network Address Translation,网络地址转换)
路由
路由器 把IP数据包的目的IP地址 和 路由表对比,找到匹配的路由表项之后,根据这个路由表项的指示将数据包转发给下一个网络设备或PC
ICMP
一个新搭建好的网络需要先进行简单的测试验证网络的连通性,但是IP协议并不提供可靠传输,如果丢包,IP协议并不能通知传输胡层是否丢包以及丢包的原因
功能:
- 确认IP包是否成功到达目标地址
- 通知在发送过程中IP包被丢弃的原因
数据链路层
以太网技术标准
包含了数据链路层的内容,也包含了一些物理层的内容,例如规定了网络拓扑结构,访问控制方式,传输速率等。与以太网并列的技术标准还有令牌环网、无线LAN等。
以太网帧格式
目的地址(6字节) + 源地址(6字节) + 类型(2字节) + 数据(46~1500字节) + CRC(4字节)
帧协议类型字段有三种值,分别对应IP、ARP、RARP,用于确定上层交付的协议类型
IP的数据报长度为46~1500字节
ARP的数据报长度 = ARP请求/应答(28字节) + PAD(18字节)
RARP的数据报长度 = RARP请求/应答(28字节) + PAD(18字节)
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位
ifconfig命令可以查看ip地址,mac地址和MTU
ARP协议
作用:建立了主机IP地址和MAC地址的映射关系
常见面试题
URI和URL的区别是什么?
URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
URL(Uniform Resource Location) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。
URI的作用像身份证号一样,URL的作用更像家庭住址一样。URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。
解释下TCP的三次握手和四次挥手
为什么非要是三次握手和四次挥手?
TCP和UDP的区别
TCP协议如何保证传输的可靠性?
描述下在浏览器中输入URI到显示网页的整个过程
1、DNS域名解析
- 在浏览器DNS缓存中搜索
- 在操作系统DNS缓存中搜索
- 读取系统host文件,查找其中是否有对应的IP
- 向本地配置的首选DNS服务器发出域名解析请求
2、建立TCP连接(三次握手)
- 1、发送端首先发送一个带SYN(synchronize)标志的数据包给接收方
- 2、接收方收到后,回传一个带有SYN/ACK(acknowledegment)标志的数据包以示传达确认信息
- 3、最后发送方再回传一个带ACK标志的数据包,代表握手结束
在这过程中若出现问题中断,TCP会再次发送相同的数据包。TCP是一个端到端的可靠的面向连接的协议,所以HTTP基于传输层TCP协议不用担心数据的传输的各种问题。
3、发送HTTP请求
请求报头(分四部分)
- 请求行:请求方法 + 请求资源地址 + 版本
- (Header)请求头:请求的属性,冒号分隔的键值对,每组属性之间使用\n分隔,遇到空行表示Header结束
- 空行
- (Body)请求正文:空行后面的内容都是Body,允许为空字符串,如果Body存在,则在Header中会有一个Content-Length属性来表示Body的长度
4、接收HTTP请求
响应报头(分四部分)
- 状态行:HTTP版本 + 状态码 + 状态码描述
- (Header)响应报头:响应的属性,冒号分隔的键值对,每组属性之间使用\n分隔,遇到空行表示Header结束
- 空行
- (Body)响应正文:如果服务器返回一个HTML页面,那么该页面内容就在Body中
5、处理响应
- 浏览器解析HTML
- 浏览器布局渲染
6、断开连接(四次挥手)