一:网络模型(ISO/OSI参考模型)
开放系统互联模型(ISO/OSI参考模型,也叫七层网络模型)
层次 | 作用 | 传输单位(统称为PDU) | 例子和类比 |
---|---|---|---|
应用层 | 与应用程序界面沟通,以达到展示给用户的目的:HTTP、HTTPS、FTP、SSH、SMTP、TELNET、POP3等 | APDU | 经理:写了一份邮件草稿 |
表示层 | 处理数据格式、压缩、数据加密 | PPDU | 助理:修改错字,对格式重新编排 |
会话层 | 建立、维护、管理会话 | SPDU | 秘书:找到收件人地址,将信封封好 |
传输层 | 建立端到端连接,提供可靠的数据传输服务,它检测路由器丢弃的包,然后产生重传请求,也能够将乱序收到的包重新排序 | segment | 司机:将信件带到邮局,到这一层,公司事务完成 |
网络层 | 寻址和路由选择 | 分组(packet、包) | 排序工人:将信件按地区分开,邮局事务开始 |
数据链路层 | 提供介质访问、链路管理 | 帧(frame) | 包装工人:将信件包装成一叠 |
物理层 | 提供比特流传输 | 比特流(bit) | 搬运工人:压箱,运输 |
四层网络模型
实际广泛应用的模型
层次 | 对应关系 | 协议(通信的基础,是协议一致,就好像你用英语,我也要用英语,才能沟通) |
---|---|---|
应用层 | 对应于应用层、表示层、会话层 | HTTP、FTP、telnet,QQ协议等,为完成特定的应用功能而制定的协议 |
传输层 | 对应于传输层 | TCP、UDP |
网络层 | 对应于网络层 | ICMP、IP、IGMP |
链路层 | 对应于数据链路层和物理层 | ARP(地址转化协议,将逻辑地址(IP地址)转化为物理地址)、RARP(将物理地址转化为IP地址) |
封装/解封装
每一层的协议通过对数据加头部进行封装
- http协议添加的 httpHeader(应用层)
- TCP在http头部的基础上,添加tcp头部(传输层)
- IP在TCP的基础上,添加IP头部(网络层)
- 添加以太网头部(链路层)
解封就是去掉头部的过程
端口:找到应用程序入口
IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)是负责协调一些使Internet正常运作的机构
下面的端口分配只是通常情况,也有例外,如SUN的RPC从32768开始
端口类型 | 作用 |
---|---|
众所周知的端口 | 0-1023,IANA管理,通常来说,表明了某种服务协议,比如21表示的是ftp服务端口 |
注册端口 | 1024-49151,IANA管理,松散的绑定于一些服务,如3306是mysql短偶,8080是tomcat服务器端口 |
动态或私有端口 | IANA不管这些端口 |
二:链路层相关概念和协议
最大传输单元(MTU)/ 路径MTU
- 以太网和IEEE 802.3对数据帧的长度都有限制,分别为 1500 和 1492,这个限制叫做MTU(Maximum Transmission Unit),一般来说,最大为1500字节,最小为46字节,不足46字节,要补全。
- 如果IP层要传的数据报大于MTU,IP层就要进行分片,让每片都小于MTU。
- 当网络上,两台主机进行通讯时,要经过多个网络,每个网络的链路层MTU都有可能不一样,其中最小的MTU叫做路径MTU。
以太网帧格式
帧: | 目的地址 | 源地址 | 类型 | 数据 |
---|---|---|---|---|
长度(字节): | 6 | 6 | 2 | 46-1500 |
ICMP(网络层 or IP层协议)
地址解析,链路层将逻辑地址(IP)转化为物理地址(MAC)时,有可能出现错误,比如IP地址对应的物理地址是不存在的,这时候需要通过一种机制通知源端(发送端),这种机制就是ICMP协议。
ICMP协议: 用于传递差错信息,时间、回显、网络信息等控制数据
例如:
1:当我们使用IP地址将数据封装成数据帧后,在网络上通过路由器多次跳转,最终发现其对应的物理地址不存在,这时候,就要将错误信息使用ICMP协议进行封装,返回给源端。
2:又比如,IP层会对要传输的数据进行分包,如果分包出错,包的大小大于链路成的路径MTU(最大传输的包大小),传输必定会出错,错误信息也是通过ICMP协议返回的。
实际上,ping 就是使用ICMP实现的
ARP:地址解析协议
作用是映射IP地址到MAC地址
比如 10.0.0.2 要发送一个包到 10.0.0.1 ,数据链路层会通过广播的形式,对网络上的所有主机发送10.0.0.1,10.0.0.1的主机得到响应后,就会将自己的物理地址返回。
本地ARP: ARP高速缓存,第一次找到物理地址后,就会将物理地址保存在这。
例子,ping的工作原理:
- 应用程序ping会判断发送的是主机名还是IP地址,如果是主机名,就调用gethostbyname()解析主机B,将主机名转换成一个32位的IP地址,这个过程就叫DNS域名解析。
- ping程序向目标IP发动一个ICMP的ECHO包。
- 在局域网内发动ARP请求广播,查找主机B的硬件地址。
- 主机B的ARP协议层收到主机A的ARP请求后,将本机的硬件地址填充到答应包,发送ARP应答到主机A。
- 发送ICMP数据包到主机B。
- 主机B接收到主机A的ICMP包,发送响应包。
- 主机A收到主机B的ICMP响应包。
RARP:反向地址解析协议
通常用于无盘工作站中,无盘工作站由于没有硬盘,不知道自己的ip地址,只知道自己的物理地址,在发送数据前,先将自己的物理地址发送给RARP服务器,RARP服务器返回它的IP地址,这个过程就叫做反向地址解析协议。
三:网络层的相关概念和协议
IP数据报格式
版本号(4位):ipv4值为4,ipv6值为6 | 首部长度(4位):(0101-1111,即5-15 分别乘以4等于 20-60) | 服务类型(8位):包括3位的优先权,已忽略,4位的服务类型,分别为D(最小延迟)T(最大吞吐)R(最高可靠性)F(最小费用),还有一位的保留位 | 总长度:(16位)最大65535,包含IP的头部和数据部分 |
标识(16位):每发送一次+1,最大为65535,到了最大值后,从1开始 | 标志(3位):第一位不使用,第二位DF(Don't Fragment)如果为1表示传输的数据报超过最大传输单元,数据报会被丢弃,并发送ICMP差错报文。第三位MF(More Fragment)表示是否有更多的片,如为1,说明后续还有分片,最后一片MF为0 | 片偏移(13位):分片后,当前片相对于原数据的偏移量,传输层重排列的依据 | |
生存时间TTL(8位):表示数据报最多可通过的路由器的数量,数据报每经过一个路由器,TTL减1,减为0时丢弃,并发送ICMP报文通知源主机。TTL可以避免数据报在路由器之间不断循环 | 协议类型(8位):表示IP层上承载的是哪个高级协议,1:ICMP 2:IGMP 6:TCP 17:UDP,通过协议类型,协议栈知道该交给上层的哪个协议处理。 | 头部校验和(16位):使用网际校验和保证头部数据的完整性 | |
源IP地址(32位): | |||
目的IP地址(32位): | |||
选项(32位): | 填充(选项必须是4的整数倍,不足就用0填充) | ||
数据 |
网际校验和
反码算数运算:
两个数进行二进制反码求和的运算很简单。它的规则是从低位到高位逐列进行计算。0和0相加是0,0和1相加是1,1和1相加是0但要产生一个进位1,加到下一列。如果最高位相加后产生进位,则最后得到的结果要加1。
网际校验和算法:
发送方: 先把被校验的数据划分为许多16位字的序列。如果数据的字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。用反码算数运算把所有16位字相加后,然后再对和取反码,便得到校验和。
接收方: 将收到的数据报(包括校验和字段),将所有16位字再使用反码算数运算相加一次,将得到的和取反,即得出校验和的计算结果。如果数据报在传输过程中没有任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出差错,并将此数据报丢弃。
路由
- 查询是否在同一个网段:将本机ip地址和目标主机ip地址与子网掩码做与运算,看结果是否相同(如192.168.0.5 与 255.255.255.0做与运算的结果就是 192.168.0.0),如果相同就在同一个网段。
- 查路由表:如果不在同一个网段,就查询本机的路由表,看是否有到目标ip的路由信息,如果没有查到,就会将信息发送到默认网关,如 192.168.0.1。
- 知道了下一跳的地址,主机A开始封装,信息如下
之后一跳一跳的,直到到达主机B
TCP
TCP特点
传输的单位是 segment(段)
- 基于字节流:传输层没有给定传输的边界,因此存在粘包问题
- 面向连接:先建立连接,再传输数据
- 可靠传输:通过网际校验和来保证传输数据的完整性(不丢失、重复)
- 缓存传输:不会立即传输数据,而是选择一个最佳的时间
- 全双工:发送数据的同时,也可以接收数据
- 流量控制:通过窗口机制提供流量控制
TCP报文格式
IP头部 | tcp头部 | tcp数据 |
---|
下面是tcp头部和数据具体组成
序号: 表示报文中,第一个字节在原数据中的序号
确认号: 仅当ACK标志为1时有效,确认号表示期望收到的下一个字节的序号
头部长度: 头部最长60个字节
6个标志位:
标志位 | 含义 |
---|---|
URG | 紧急指针有效 |
ACK | 确认序号有效 |
PSH | 接收方应尽快将这个报文段交给应用层 |
RST | 连接重置 |
SYN | 同步序号用来发起一个连接 |
FIN | 表示將要終止一个连接 |
窗口大小: 用于流量控制。
检验和: 网际校验和,用于保证数据的完备性。
紧急指针: 是一个正的偏移量,与序号字段中的值向相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
选项: 常见的如最大传输报文MSS ,表示本端能够接收的最大长度的报文段,默认是536,加上tcp头部20字节,ip头部20字节,就是576字节到IP层。如果报文长度大于链路层的限制(MTU),IP层就要进行分包。为了避免tcp层分包,我们一般设置512字节一个包。
三次握手
为什么是三次而不是两次?
由于tcp连接是一种全双工通讯,连接的双方都可以发送和接收数据
- a向b发送数据。
- b收到数据后,向a表示确认能够收到数据,向a发送确认。
- a收到确认后,表示确认能够收到b的数据,连接建立。
之所以是三次,因为收发双方都要确认对方能够发送和接收数据
三次握手具体过程
首先说两个标志位的意思:
SYN:表示期望发起连接
ACK:表示确认收到请求
- A发起一个连接请求,符号 SYN= a
- B收到后,返回一个确认符 ACK=a+1,并发起一个连接请求符 SYN=b
- A收到确认符,是自己所期望的 a+1,还收到一个连接请求符 b,对请求进行确认,发动一个确认符 ACK=b+1
- B收到确认符,发现是自己所期望的 b+1,连接建立
发起两次,确认两次,一共四次,所以要三次握手
四次挥手
标志位FIN: 表示期望终止连接
过程:
- 由于是终止连接,所以A在发起终止时,先要确认收到了之前的包,发送ACK=y,然后发起终止,FIN=x
- B收到A发起的终止后,回复一个确认包 ACK=x+1
可以描述为:A告诉B,我不会向你发送数据了,B收到,告诉A,我知道了。 A->B的连接终止
- B紧接着向A发起终止,FIN=y
- A收到B发起的终止,发送一个确认符 ACK=y+1
B->A的连接终止,至此,双方连接终止完成
如何保证可靠性
首先说说不可靠表现在哪些地方
- 差错:TCP通过校验和来保证
- 丢包:超时重传 + 确认机制
- 失序:TCP发送的每个数据段有一个序号,接收端会根据序号对数据进行重排
- 重复:序号机制同样可以保证不重复
数据发送过程
- TCP将数据划分成最适合发送的数据块,称为段,传递给IP层
- 当TCP发出一个段后,启动一个定制器,等待接收端确认收到这个报文段。如果没能及时收到,将重新发送。
- 当TCP收到另一端的数据,将发送一个确认,但并不是立即发送,会推迟几分之一秒。
- TCP将保持它的首部和校验和,目的是检测数据在传输过程中的任何变化。如果收到端的校验和有差错,TCP将丢弃这个报文,并不确认(导致对方超时重传)。
- TCP承载于IP数据报,而IP数据报的到达可能会失序,因此TCP报文段的到达也有可能失序。TCP将对收到的数据进行重排序。
- TCP还能提供流量控制。
滑动窗口协议和UDP
滑动窗口协议
用于流量控制
A一直向B发送数据,直到达到窗口上限
B 向A返回1-6的确认信息,窗口向后滑动,A删除1-6的数据
由于删除了B已经收到的数据,窗口向后滑动,可以发送剩下的数据包
B的确认消息(1-6)发出后,B的窗口也往后移。
此时1-6就是收到的字节,应用程序可以读取
数据包7、8、9丢失,这个时候B发送确认7,和选择性确认,让A重新发7、8、9
缓存使用完之后,滑动窗口归0,缓存可以重复使用。
之所以说滑动窗口可以节约流量,就是他对发送速 度进行了控制,预防应用程序发送的数据超过了对方的缓冲区。
UDP特点
- 无连接
- 不可靠
- 高效