TCP/IP四/五层模型
TCP/IP协议簇由来
TCP/IP协议簇是基于DoD模型而订制的各种网络协议
而DoD模型(美国国防部模型)是美国国防部设计的一个网络模型,它相当于一个OSI模型的精简版,OSI模型是7层,而它是4层,并且两者具有对应关系
目前直接将DoD模型称为为TCP/IP模型,并且现在网络通信基本上使用的都是TCP/IP模型
标准定义的TCP/IP模型为四层模型,没有对网络接口层进行明确的细分
但是我们在使用TCP/IP模型时,一般会网络接口层分为链路层物理层来使用
应用层常见协议——传输数据PDU
通过各种协议向终端用户提供业务应用
DNS——建立域名与IP之间的关系
HTTP——超文本传输协议
HTTP将图像,视频,文件有,音乐等传输给客户端供用户上网访问
不安全,现在基本都是用Https协议
HTTPS——安全的超文本传输协议
相比于Http增加了加密验证功能
SMTP——用于发送邮件
POP3/IMAP——用于接收邮件
IMAP功能相比于POP3更多
IMAP和POP3的主要区别
Telnet——远程登录服务的标准协议
不安全,现在一般使用SSH进行远程登录
SSH——加密远程登录管理
通过密钥进行加密认证
FTP——文本传输协议
提供可靠的文件传输 服务,具有认证,权限的功能
TFTP——简单文件传输协议
提供不可靠的文件传输服务
消耗资源小,速度快
常用于网络设备的配置文件和系统文件传输
传输层协议——传输数据段
传输层提供面向连接或非面向连接服务以及进行重传前的差错检验
传输层只定义了两种协议TCP和UDP
端口号
端口号用来区分不同的应用层协议,当解封时看到传输层携带的端口号,就能了解到上层应用层携带的是何种应用层协议
端口号分类
0~1023 公认/知名端口号
1024~49151 应用注册使用的端口号
49152~65535 私有/动态端口(主机/客户端使用)
知名端口号
端口号 | 指定的上层应用层协议 | 所属传输层协议 |
20 | FTP数据平面 | TCP |
21 | FTP控制平面 | TCP |
22 | SSH | TCP |
23 | Telnet | TCP |
25 | SMTP | TCP |
80 | HTTP | TCP |
110 | POP3 | TCP |
443 | SSL | TCP |
179 | BGP | TCP |
53 | DNS | TCP/UDP |
67 | DHCP(服务端监听的端口) | UDP |
68 | DHCP(客户端监听的端口) | UDP |
69 | TFTP | UDP |
161 | SNMP | UDP |
520 | RIP | UDP |
TCP面向连接服务CONS
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议
TCP适用场景
文件传输(对数据准确性要求高、速度可以相对慢)
邮件传输(对数据准确性要求高、非紧急)
远程登录(对数据准确性要求高、有连接的概念)
TCP报文格式
固定长度20字节,可变长度40字节
TCP的最大报文段长度即MSS一般是1460字节(1500MTU-20IP Head-20TCP Head)
MSS(最大分段大小)指数据的长度最大1460字节
源端口 Source port
标识哪个应用程序发送的
目标端口 Destination Port
标识哪个应用程序接收的
序列号 Sequence Number(简称seq)
在TCP传送的数据流中,每一个字节都有一个序号,在发送报文时会携带Seq
seq=seq+载荷(seq = 自己上一个报文的seq+自己上一个报文的载荷)
载荷就是上层的所有包,此处指应用层的包(数据data)
seq是32位的无符号数,当seq到达2^32-1后从0开始,依次循环
例如:第一报文段的seq为300,而且载荷数据共100字节,则下一个报文段的seq就是400
确认序号 Acknowledge Number (简称ack)
确认序号对收到的TCP报文做确认,实现数据传输可靠
Ack=seq+载荷(ack = 对方发来报文的seq+对方发来报文的载荷)
注意:只有Flags中的ACK标志为1时,确认序号才有效
如何通过对端发来的ACK验证对端是否收到了我发送的数据
本端收到的对端发来的ACK,如果该ACK等于自己上个报文的seq+载荷,则认为对端收到了我发送的上一个报文
报头长度Header length
用0000~1111来标识,其得出来的数值乘以4就是报文头部长度
即0001=1,则其就代表报文头部为4个字节
TCP头部默认20个字节,其报文长度也就是0101(5)
在TCP连接建立阶段,该头部一般为24字节(0110--6),多出来的4字节为MSS协商
标识 Flags
Urgent:紧急指针位。当URG=1时,先发送此报文,不用等待,和紧急位字段一起使用。
ACK:确认位。只有当ACK=1时,确认序号字段才有 效;
Push:急迫位。当PSH=1时,发送到对方后,对方先接收处理。
RST:重置位。当RST=1时,表示出现连接错误,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个不法的报文段或拒绝打开一个连接;
SYN:同步位。SYN=1代表SYN置位,SYN=1,ACK=0时表示请求建立一个连接,携带SYN标志的TCP报文段为同步报文段;只有刚开始前两次握手SYN置位。
FIN:终止位
窗口 Window
通过接收端来调节窗口大小来控制网络拥塞,最大65535
当其为0时,报文为Zero window包,下个包为保活包(keep-alive)
检验和 Checksum
对头部和内容进行校验
紧急位 Urgent Pointer
只有当Flags的URG标志置1时紧急指针才有效。
紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
先处理此序号的报文
可变长度 Option(0~40)
会携带MSS(最大分段大小)
MSS表示TCP数据包每次能够传输的最大数据分段(该大小包含MSS最大报文字段长度)
通过MTU协商出MSS,通常MSS=MTU-IP头部长度-TCP头部长度+MSS字段的长度(一般4字节)
建立TCP连接时,在发送第一个SYN数据报文的时候会携带MSS信息(告诉对端我期望接收到的TCP报文的最大长度是多少),对端发送(SYN ACK)报文携带协商后的MSS
后续传输数据时就不携带MSS字段
MSS和MTU的区别
MTU为最大传输单元:是指链路层的最大传输单元,包含TCP头部和IP头部,不包含数据链路层封装头
TCP数据传输——ACK确认机制
TCP会话建立——三次握手
通过标志位syn、ack以及序列号seq确认序列号ack实现
TCP三次握手,至少会交互三次报文
会话建立的三种情况
发送信号→对方确认→收到回复(就是上述图片的情况)
发送信号→对方否认→重传
发送信号→发送超时→主动重传
TCP会话结束——四次握手
通过标志位fin、ack以及序列号seq确认序列号ack实现
TCP四次握手,不一定交互四次报文(也有可能因为故障错误发送RST置位报文直接断开连接)
RST置位情况
服务器端口没有打开、服务器中途中断服务、服务器响应太慢导致用户终止连接
客户端段异常终止服务
网络攻击等
TCP四次挥手
TCP流量控制——滑动窗口协议
与其相关联的是窗口Windows字段,最大65535
为什么要提出窗口机制
我们知道TCP是面向字节流传输的,即将应用程序看为一串无结构的字节流进行传输
TCP接口有一个自己的发送缓冲区,如果这个字节流太长的话,TCP会将其拆分之后一段一段去发送;当字节流太短的时候,会将多个子接口集中到发送缓冲区,当达到一定的报文长度后将其发送出去;当将数据发送之后,只有等到对方发来正确的确认报文之后,才会将缓冲区的数据删除,进行下一次发送;以A和B通信为例, 正常情况下,A每发送1句话,B就对其进行确认确认(通过回复ACK确认,ACK的序列号=收到的seq+1来确认)
不过这样传输效率低下,因此引入了窗口的概念,针对发送端的多次数据报文通过一个ACK进行回应
窗口机制的原理
但是我们无法知道对方窗口的大小,不知道对方窗口能够接收的数据大小,过多过少都会影响数据的传输效率;因此通过窗口机制,协商双方的窗口大小(两边的窗口大小是一直在变化的),加速数据传输,进行流量控制
例如:A发送多句话,B通过一句确认回复(通过回复ACK确认,ACK的序列号=收到的最后一句话的seq+其载荷);并且A会根据B回复的ACK确认报文来了解到B的窗口大小,以及B接收了哪些报文
窗口大小如何协商
1、当A发送3句话,但是如果B的窗口大小只有2句话时,则第三句话会被丢弃;
2、此时B给A回复的ACK为A的第二句的序列号+1,并且将自己窗口大小为2告诉A
3、当A收到后就知道第三句话没有被B接收,并且知道了接收端的窗口大小,此时A向B发送时会控制窗口大小,即此时发送第三句和第四句话给B
TCP可靠传输机制
超时重传
接受方没有收到发送方发来的报文,也就不会回复确认报文
发送方超时时间内没有收到确认报文,认为对方没有收到数据,重新发送数据
确认丢失
接收方收到了发送方的报文,但是回应的确认包中途丢失
此时发送方收不到确认报文,超时重传
当重传报文发到接收方时,接收方丢弃重传的报文,并重新发送确认
确认迟到
第一次确认包由于延迟很久才收到,但是在发送方收到第一次确认包的时候已经通过重传报文、重传确认包进行了确认,则发送方对于该延时的确认包不进行任何操作
TCP拥塞控制
拥塞控制的作用
在某个时间段内,如果我们对于网络中某个资源的需求超过了该资源所能提供的可用部分,这个时候网络性能发生变化,出现了网络拥塞
拥塞控制就是避免网络中出现过多的数据,避免网络链路和网络设备出现过载情况而出现网络拥塞
拥塞控制方法
慢启动算法:最开始发送较小的数据包,然后发送的数据包大小依次指数规律递增
拥塞避免:经过慢启动阶段后就开始使用拥塞避免算法来进行拥塞控制(拥塞窗口成线性增长,即每轮询一次就将cwnd加1,每次都只加1,避免了拥塞窗口快速增长)
快重传算法:主要用于丢包检测,更快的重传数据包,更早的调整通塞机的状态,从而持续升窗;
快恢复算法:当发送方检测到连续丢包时,TCP会触发快速重传并进行降窗状态,将cend减少至一半,使得一次发送更少的数据,然后在慢慢增大,预防网络拥塞
UDP无面向连接服务DLNS
无面向连接服务——在通信前要不需要建立会话连接,直接开始传输数据,不可靠
UDP适用场景
传输小数据包的场景(UDP不会主动重传,只有接收方重新申请时才会重传)
对实时性要求高的场景(直播比赛等)
报文格式
源端口 Source port
标识哪个应用程序发送的
目标端口 Destination Port
标识哪个应用程序接收的
长度 Length
UDP头部+UDP数据的字节数,最小为8字节
检验和 Checksum
对头部和内容进行校验
网络层协议——传输数据包
提供逻辑地址,通过寻址来选择合适的路由和交换节点,实现数据从源到目的地的转发
网络层协议主要是IP协议,除了IP协议还有GRE、ICMP、IGMP、OSPF等协议
IP协议
IP协议主要分为IPv4协议和IPv6协议,此处只讨论IPv4协议
报文格式 固定头部20字节,可变头部40字节(总共20~60字节)
IP报文最大长度为1500字节(头部+数据)
Version 版本
IP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6
Header Length 头部长度
固定部分的长度(20字节)和可变部分的长度之和
通过0000~1111来标识
即0001=1,则其就代表报文头部为4个字节
IP固定头部20个字节,其报文长度也就是0101(5)
DS Field 区分服务字段
用于QoS
Total Length 总长度
IP报文的总长度。报头的长度和数据部分的长度之和。
总长度最大为MTU的值,缺省为1500
Identification 标识——分片使用
该字段标记当前分片为第几个分片,在数据报重组时很有用(让其按照顺序重组)
Flags 分段标志——分片使用
该字段用于标记该报文是否为分片(有一些可能不需要分片,或不希望分片)
后面是否还有分片(是否是最后一个分片)。
该字段共3位。R、DF、MF三位。目前只有后两位有效
R——保留位必须为0
DF——报文是否分片,为1表示不分片,为0表示分片。
MF——报文是否是最后一个分片,为1表示“更多的片”,为0表示这是最后一片。
例如:0x00---000 代表分片,最后一片
0x40---010 代表不分片,最后一片
0x20---001 代表不分片,还有更多的片
Fragment Flags 分段偏移——分片使用
指当前分片在原数据报(分片前的数据报)中相对于用户数据字段的偏移量,即在原数据报中的相对位置,为 0 代表是第一个包
TTL 存活时间
IP报文所允许通过的三层设备的最大数量,最大为255
每经过一个三层设备,TTL减1,当为0时,路由器将该数据报丢弃。
丢弃报文时向报文中的源IP地址发送ICMP错误消息(TTL Exceeded包)类型为 11 0。
Protocol 协议
该值标识网络层的上层协议,可以是其它网络层协议,也可以是传输层协议
协议号 | 上层协议 |
1 | ICMP |
2 | IGMP |
9 | IGRP |
41 | IPv6(IPv6过渡技术 IPv4封装IPv6时使用) |
47 | GRE |
50 | ESP |
51 | AH |
57 | SKIP |
88 | EIGRP |
89 | OSPF |
115 | L2TP |
6 | TCP |
17 | UDP |
Header Checksum 校验和
计算IP头部的校验和,检查IP报头的完整性
Source Address源地址
Destination Address 目的地址
Options 可选字段(0~40字节)
数据链路层——传输数据帧
将比特组合成字节,再将字节组合成帧,使用链路层地址(其中以太网使用的是MAC地址)来访问介质,并进行差错检测
数据链路层定义了两个子层
LLC 逻辑链路控制
负责识别网络层的协议类型,对网络层的数据进行封装并向下层传递
MAC 介质访问控制
负责控制物理层设备,也就是MAC地址,大小为48位二进制(12位十六进制)
代表一个网络接口的物理地址,全球唯一
24供应商代码(组织唯一标识符OUI,由IEEE分配和管理)+24厂商自己分配
第八位为0是单播,为1是组播
数据链路层主要协议
1、PPP(点对点链路)
2、Ethernet(以太网链路)
3、FR(帧中继链路)
4、HDLC(高级数据链路控制)
5、ATM(异步传输模式)
6、802.11协议(无线传输协议)
PPP协议讲解(PPP连接状态、PPP报文)_静下心来敲木鱼的博客-CSDN博客
以太网链路(本次主要介绍以太网帧)
运行在MAC层之上
在以太网链路上传输的数据包成为以太帧
以太网帧(MAC帧)的两种标准帧格式
Ethernet_Ⅱ、IEEE802.3
IEEE802.3是Ethernet的前生,目前基本未使用(STP目前使用的是IEEE802.3帧格式)
Ethernet_II帧格式
帧大小为64~1518,NTU最大传输单元默认为1500
Type类型值大于等于1536即(0x0600)
DMAC
目的MAC地址 6字节
SMAC
源MAC地址 6字节
Type
标识上层协议类型 2字节
值 | 协议 |
0X0800 | IPV4 |
0X86DD | IPV6 |
0X0806 | ARP |
0X0808 | 帧中继ARP(反向ARP) |
0X8809 | LACP |
0X8000 | IS-IS |
0X8100 | 80.21Q(VLAN) |
0X8847 | MPLS单播 |
0X8848 | MPLS组播 |
0X8863 | PPPOE发现阶段 |
0X8864 | PPPOE会话阶段 |
0X88CC | LLDP |
0X88F5 | MVRP |
IEEE802.3帧格式
帧长度字段值小于1500(0x05DC),MTU为1492
DMAC
目的MAC地址 6字节
SMAC
源MAC地址 6字节
Length
定义了Data字段包含的字节数,不包过CRC检验码
DSAP
目的服务访问点,此处表示后面类型为STP帧
当为0x06,表示后面类型为IP帧
当为0xfe,表示后面类型为ISIS帧
SSAP
源服务访问点,此处表示后面类型为STP帧
当为0x06,表示后面类型为IP帧
Control 字段
通常为0x03,标识无连接服务的IEEE 802.2无编码数据格式
OUI
组织唯一标识符,通常为MAC地址的前3字节
Type
标识以太网帧所携带的上层数据类型
ISIS包
STP包