TCP/IP协议
一、网络层
1.地址解析协议ARP
IP地址(32位)
IP地址::={<网络号>,<主机号>}
地址分类 | net-id+host-id长度(字节) | 范围 |
A类 | 1+3 | 1.0.0.0-126.255.255.255 |
B类 | 2+2 | 128.0.0.0-191.255.255.255 |
C类 | 3+1 | 192.0.0.0~223.255.255.255 |
回环地址:127.x.x.x,被保留
有限广播地址:255.255.255.255,仅在本地网络上进行广播
直接广播地址:net-id是有效的网络号,而host-id是全1。在net-id指明的网络上的所有主机进行广播。
IP地址和MAC地址
IP地址是网络层及以上各层所使用的地址;MAC地址是物理层和数据链路层所使用的地址
ARP高速缓存(ARP cache)中有一个IP地址到硬件地址的映射表
报文格式
arp报文共42bytes:以太网首部14bytes,ARP字段28bytes
以太网首部如下表,单位为bytes:
ether_dhost | ether_shost | ether_type |
6 | 6 | 2 |
以太网目的地址Destination
以太网源地址Source
以太网帧类型:ARP为0x0806
ARP首部如下表,单位为bytes:
ar_hrd | ar_pro | ar_hln | ar_pln | ar_op |
2 | 2 | 1 | 1 | 2 |
硬件类型Harware type:以太网为1
协议类型Protocol:IPv4为0x0800
硬件地址长度:ARP中其值为6,单位为字节
协议地址长度:ARP中其值为4,单位为字节
操作类型:该报文类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4
ARP载荷如下表,单位为bytes:
arp_sha | arp_spa | arp_tha | arp_tpa |
6 | 4 | 6 | 4 |
发送方MAC地址
发送方IP地址
目的MAC地址
目的IP地址
工作流程
主机A向同一局域网下的主机B发送IP数据报
查表,有无主机B的IP地址:
若有,则根据IP地址在映射表中查出对应硬件地址,并将硬件地址写入MAC帧。
若无,则主机A就自动运行ARP:
- ARP进程在局域网广播一个ARP请求分组。
- 本局域网上的所有主机运行的ARP进程收到这个ARP请求分组。
- 主机B的IP地址与ARP请求分组中要查询的IP地址一致,收下ARP请求分组,并向主机A发送写入主机B硬件地址的ARP响应分组,其他主机不响应。
- 主机A收到主机B的响应分组,就在主机A的高速缓存中写入主机B的IP地址到硬件地址的映射
(1)主机A发送请求(广播)
广播帧
以太网首部的目的地址为广播帧特定MAC地址:FF:FF:FF:FF:FF:FF,源地址为主机A的MAC地址。
ARP请求中,op字段为1,ARP请求报文的发送方MAC地址为主机A的MAC地址,发送方IP地址为主机A的IP地址;目的MAC地址一般为00:00:00:00:00:00(没有特别设置ar$tha的值(设置为全0),因为它正试图确定这个值),目的IP地址为主机B的IP地址。
(2)主机B响应请求(单播)
单播帧
以太网首部的目的地址为主机A的MAC地址,源地址为主机B的MAC地址。
ARP回应中,op字段为2,ARP响应报文的发送方MAC地址为主机B的MAC地址,发送方IP地址为主机B的IP地址;目的MAC地址为主机A的MAC地址,目的IP地址为主机A的IP地址。
免费ARP(Gratuitous ARP)
免费ARP包的目的IP地址为自己的IP地址,免费ARP不期望收到回应
作用:
(1)宣告,告诉其他主机自己的IP地址和MAC地址。如果主机改变了硬件地址,发送免费ARP可以更新其他主机的ARP缓存表。
(2)检测冲突,确认另一个主机是否设置了相同的IP地址。如果收到了一个回答,终端日志产生一个错误信息。
2.网络协议IP
IP数据报格式
IP首部的固定部分格式如下表,单位为bit:
版本 | 首部长度 | 区分服务 | 总长度 |
4 | 4 | 8 | 16 |
标识 | 标志 | 片偏移 | |
16 | 3 | 13 | |
生存时间 | 协议类型 | 首部校验和 | |
8 | 8 | 16 | |
源地址 | 目的地址 | ||
32 | 32 |
版本:IP协议的版本,IPv4为4,IPv6为6。
首部长度:IP首部的固定部分的长度为20字节,4字节为单位,所以首部长度的最小值为5,最大值为15(即60字节)。
区分服务:PPP:3位,定义包的优先级,取值越大数据越重要。
D:低时延
T:高吞吐
R:高可靠
M:低成本
0:恒为0
总长度:首部和数据的长度之和。数据链路层规定了一个数据帧中的数据字段的最大长度,即最大传送单元MTU,例如常用以太网规定MTU值为1500,数据报大于MTU,则必须对数据报进分片。
标识:同一数据报的分片具有相同的标识字段,使分片后的各数据报能够正确重组。
标志:3位;
最低位MF(More Flagment),MF=1表示还有分片,MF=0表示最后一个分片
中间位DF(Don't Flagment),DF=1表示不能分片,DF=0表示可以分片
最高位保留
片偏移(Flagment Offset):某片相对于用户数据字段的位置,8字节为单位
生存时间:TTL,路由器每转发一次数据报,TTL值减1,减为0丢弃数据报。分片过程如下图
协议:报文的数据段所使用的协议类型
几种常用协议号如下表:
ICMP | IGMP | IP | TCP | UDP | IPv6 |
1 | 2 | 4 | 6 | 17 | 41 |
首部校验和:只校验数据报的首部,首部分成16位一组,反码求和,结果取反码
源地址:发送方IP地址
目的地址:目的IP地址
IP首部的可变部分如下表,单位为bit:
可选字段 | 填充 |
1~40字节不等
可选字段:增加IP数据报的功能。
Type | Length | Description |
0 | - | End of option list |
1 | - | No operation |
130 | 11 | Security |
131 | Loose Source Routing | |
137 | Strict Source Routing | |
7 | Record Route | |
136 | 4 | Stream ID |
68 | Internet Timestamp |
填充:首部长度不是4字节的整数倍,利用填充字段进行填充。
分片和重组
(1)分片
源主机会根据数据链路层的MTU值判断数据报是否进行分片,分片后的格式不变。首部与原数据报相同,但标志和片偏移字段会进行相应修改。数据段则为原数据段的一个连续部分。
(2)重组
目的主机收到分片后,对各分片进行组装。根据标识确定分片属于哪个IP数据报,根据标志MF子字段确定是否为最后一个分片,根据片偏移字段确定分片在原数据报中的位置。
转发分组流程
路由表(目的网络地址,下一跳地址)
分组转发算法如下:
(1)从数据报的首部提取目的主机的IP地址D得出目的网络地址为N
(2)若N就是与此路由器直接相连的某个网络地址,则直接交付;否则间接交付,执行(3)。
(3)若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行(4)。
(4)若路由表中有到达网络N的路由,则把数据报传送给路由表中指明的下一跳路由器;否则,执行(5)。
(5)若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行(6)。
(6)报告转发分组出错
子网划分
从网络的主机号借用若干位作为子网号
三级IP地址::={<网络号>,<子网号>,<主机号>}
如何确定一个网络是否划分子网——子网掩码
子网掩码和IP地址进行逐位的“与”(AND)运算
如果一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码。
A类 255.0.0.0
B类 255.255.0.0
C类 255.255.255.0
使用子网时分组的转发
路由表:目的网络地址、子网掩码和下一跳地址。
(1)从收到的数据报的首部提取目的IP地址D。
(2)先判断是否为直接交付。对路由器直接相连的网络地址逐个进行检查;用各网络的子网掩码和D逐位相“与”(AND操作),看结果是否和相应的网络地址匹配。若匹配,则把分组进行直接交付。否则就是间接交付,执行(3)。
(3)若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由表;否则,执行(4).
(4)对路由表中的每一行(目的网络地址,子网掩码,下一跳地址),用其中的子网掩码和D逐位相“与”(AND操作),其结果为N。若N与该行的目的网络地址匹配,则把数据报传送给该行指明的下一跳路由器;否则,执行(5)。
(5)若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行(6)。
(6)报告转发分组出错
3.网络控制报文协议ICMP
ICMP报文装在IP数据报的数据部分
ICMP报文格式如下表,单位为bytes:
类型 | 代码 | 校验和 |
1 | 1 | 2 |
首部其他部分 | ||
4 | ||
ICMP的数据部分 |
ICMP报文的种类有两种,即ICMP差错报文和ICMP询问报文
几种常用的ICMP报文类型如下表:
ICMP报文种类 | 类型值 | ICMP报文的类型 | 代码 |
差错报告报文 | 3 | 终点不可达 | 0~15(常用0~4) |
4 | 源站抑制 | 0 | |
5 | 改变路由 | ||
11 | 时间超过 | 0,TTL超时 1,分片重组超时 | |
12 | 参数问题 | ||
询问报文 | 8或0 | 回显请求或者应答 | 0 |
10或9 | 路由询问或通告 | 0 | |
13或14 | 时间戳请求或者应答 | 0 | |
15或16 | 信息请求或应答 | ||
17或18 | 地址掩码请求或应答 | 0 |
终点不可达:
代码为0,网络不可达
代码为1,主机不可达
代码为2,协议不可达
代码为3,端口不可达
代码为4,需要分片的数据包,但DF为1
差错报文
差错报文格式:
ICMP的前8字节 | IP数据报首部 | IP数据报的数据字段的前8字节 |
IP数据报的数据字段的前8字节对应上层协议首部的前8字节。(运输层的端口号以及运输层的发送序号)
询问报文
(1)回送请求和回答
这种询问报文用来测试目的站是否可达以及了解其有关状况。
主机或路由器向目的主机发出回送请求报文
收到回送请求报文的主机给源主机或路由器发送ICMP回送回答报文
(2)时间戳请求和回答
请某主机或路由器回答当前的日期和时间。
不产生ICMP差错报文的几种情况:
1.ICMP差错报文
2.不是IP分片的第1片
3.目的IP为广播地址或多播地址的IP数据报
4.源地址不是单个主机的数据报,即零地址、环回地址、广播地址或多播地址
应用举例:PING
分组网间探测PING,测试两台主机之间的连通性
二、传输层
1.协议端口号
16位端口号
(1)服务器端使用的端口号
熟知端口号(系统端口号),数值为0~1023
FTP | TELNET | SMTP | DNS | TFTP | HTTP | SNMP | SNMP(trap) | HTTPS |
21 | 23 | 25 | 53 | 69 | 80 | 161 | 162 | 443 |
登记端口号,数值为1024~49151
(2)客户端使用的端口号
仅在客户进程运行时才动态选择,又叫短暂端口号,数值为49152~65535
2.TCP
套接字socket=(IP地址:端口号)
TCP连接::={socket1,socket2}={(IP1:port1),(IP2:port2)}
报文格式
源端口 | 目的端口 | ||
2 | 2 | ||
序号 | |||
4 | |||
确认号 | |||
4 | |||
首部长度 | 保留 | 6位标志 | 窗口 |
4bit | 6bit | 6bit | 2 |
校验和 | 紧急指针 | ||
2 | 2 | ||
选项 | |||
0~40 |
6位标志:
(1)URG:URG=1,紧急指针字段有效,有紧急数据
(2)ACK:ACK=1,确认号字段有效,连接建立后所有传送的报文段都必须把ACK置1。
(3)PSH:接收方收到PSH=1的报文段,就尽快交付接收应用进程。
(4)RST:RST=1,表明TCP连接出现严重差错,必须释放连接,然后再重新建立连接;或者拒绝打开一个连接。
(5)SYN:连接建立时用来同步信号。SYN置为1,表示这是一个连接请求或者连接接受报文。
(6)FIN:释放一个连接。FIN=1,表明此报文的发送方的数据已发送完毕,并要求释放连接。
选项(option):
Kind | Length | Info |
1 | 1 | n |
描述 | kind(1字节) | Length(1字节) | |
EOP | 0 | ||
NOP | 1 | ||
MSS(2字节) | 2 | 4 | MSS值 |
窗口扩大(1字节) | 3 | 3 | 0~14 |
选择确认 | 4 | 2 | - |
SACK | 5 | 2+N*8 | 左边沿\右边沿 |
时间戳(4+4) | 8 | 10 | timestamp+timestamp echo |
填充
停止等待协议
每发送完一个分组就停止发送,等待对方的确认,收到确认后发送下一个分组。
超时重传后,接收方的动作:
1.差错报文
发送方超时重传后,接收方接收报文并发送确认。
2.确认丢失
发送方超时重传后,接收方丢弃重复分组并发送确认。
3.确认迟到
发送方超时重传后,接收方丢弃重复分组并发送确认;发送方收到迟到的确认,但什么也不做。
连续ARQ协议
以字节为单位,TCP是基于字节流的传输协议
发送方:连续发送,将发送窗口内的分组连续发送出去
确认方:累积确认,对按序到达的最后一个分组发送确认
确认丢失,窗口回退
超时重传Karn
超时重传时间RTO
报文最大生存时间MSL
往返时间RTT
加权平均往返时间RTTs
新的RTTs=(1 - α)*旧的RTTs + α*(新的RTT样本)
指数退避:RTO新 =RTO旧*2
RTO的上限为2*MSL
选择确认SACK
收到无序段
首部选项中增加1字节的SACK类型字段、1字节的选项长度、字节块的边界序号
流量控制Nagle
发送窗口控制:发送方的发送窗口不能超过接收方给出的接收窗口的数值
零窗口探测:接收方发送了零窗口的报文段,即此时接收方不能再接收数据了。此时,发送方启动持续计时器,时间到期,就发送一个零窗口探测报文段
最大报文长度MSS
Nagle:
- 收到对前一个报文段的确认才发送下一个报文段
- 缓存待发送的数据,直到数据达到MSS或者发送窗口的一半大小时,立即发送1个报文段。
三报文握手(建立连接)
客户端 | 服务器端 | |
IP地址 | 172.100.10.237 | 180.163.222.164 |
端口 | 51808 | 80 |
初始状态 | CLOSED | CLOSED |
首先服务器端进入LISTEN状态
(1)第一次报文传输:客户端->服务器端,连接请求,SYN=1,ACK=0,seq=x
客户端发送报文后进入SYN-SENT状态
服务器端收到报文后进入SYN-RCVD状态
(2)第二次报文传输:服务器端->客户端,确认,SYN=1,ACK=1,seq=y,ack=x+1
客户端收到报文后进入ESTABLISHED状态
(3)第三次报文传输:客户端->服务器端,确认,SYN=0,ACK=1,seq=x+1,ack=y+1
服务器段收到报文后进入ESTABLISHED状态
四报文挥手(释放连接)
客户端 | 服务器端 | |
IP地址 | 180.163.222.164 | 172.100.10.237 |
端口 | 80 | 51810 |
初始状态 | ESTABLISHED | ESTABLISHED |
(1)第一次报文传输:客户端->服务器端,连接释放请求,FIN=1,ACK=0,seq=u
客户端发送报文后进入FIN-WAIT-1状态
服务器端收到报文后进入CLOSE-WAIT状态
(2)第二次报文传输:服务器端->客户端,确认,FIN=0,ACK=1,seq=v,ack=u+1
客户端收到报文后进入FIN-WAIT-2状态
这时,TCP连接处于半关闭状态,即客户端到服务器端的连接关闭,服务器端到客户端的连接未关闭
(3)第三次报文传输:服务器端->客户端,连接释放,FIN=1,ACK=1,seq=w,ack=u+1
服务器端发送报文后进入LAST-ACK状态
客户端收到报文后进入TIME-WAIT状态
(4)第四次报文传输:客户端->服务器端,确认,FIN=0,ACK=1,seq=u+1,ack=w+1
服务器端收到报文后进入CLOSED状态
最后客户端等待2MSL最长报文段寿命的时间后进入CLOSED状态
RST字段
异常关闭连接意义
可直接丢弃缓存区的数据,快速释放连接。
产生RST的条件
- 未对外提供服务的端口。客户端发送SYN连接请求后,服务器端发现不存在该端口(客户端的目的端口),服务器端发送一个RST,中断连接请求。
- 客户端和服务器的某一方在交互过程中发现异常,该方发送RST。
- 一个已关闭的TCP连接收到TCP报文,发送RST。
- 长期未收到来自对方的确认报文,即超过一定重传次数或时间,发送RST。
有限状态机
服务器端有数据要发给客户端时,就会发送一个SYN报文给客户端,此时,服务器端的LISTEN状态就会转变为SYN-SENT状态;客户端的SYN-SENT状态就会转变为SYN-RCVD状态。双方的角色发生转变。
(1)主动方发送FIN请求关闭连接,这个FIN还没到被动方,被动方恰好也想主动关闭TCP连接,给主动方发送FIN,主动方收到FIN后回复ACK,进入CLOSING,被动方收到FIN后回复ACK,主动方收到ACK后,进入TIME_WAIT。
(2)主动方发送FIN请求关闭连接,被动方接收到后,发现自己没有数据要发送,就把ACK和FIN放在一起发出,主动方收到后,直接进入TIME_WAIT。
1.CLOSED状态
处于CLOSED状态时收到报文,必须发送RST响应。
无RST标志,无ACK标志时,发送零序列号的报文。
无RST标志,有ACK标志是,发送序列号为ack的报文。
处于CLOSED状态的TCP在应用层的“active OPEN”请求下,必须发送SYN报文
2.SYN-SENT状态
处于SYN-SENT状态时收到<SYN,ACK>报文,建立连接,进入ESTABLISHED状态。
3.UDP
首部格式
源端口 | 目的端口 | 长度 | 校验和 |
2 | 2 | 2 | 2 |
长度:UDP用户数据报的长度,最小值为8(仅有首部)
校验和:计算校验和,要在UDP用户数据报之前增加12个字节的伪首部。
伪首部格式:
源IP地址 | 目的IP地址 | 全0 | 17 | UDP长度 |
4 | 4 | 1 | 1 | 2 |
TCP与UDP对比
TCP | UDP |
面向连接 | 无连接 |
可靠交付 | 尽最大努力交付 |
一对一 | 一对一、一对多 多对一、多对多 |
全双工通信 | |
面向字节流 | 面向报文 |
三、应用层
-
DHCP协议
DHCP(Dynamic Host Configuration Protocol)动态主机配置协议是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下,DHCP作为Windows Server的一个服务组件不会被系统自动安装,还需要管理员手动安装并进行必要的配置。
三种分配IP地址的机制:
1) 自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。
2) 动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
3) 手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。
三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。
工作原理
DHCP协议采用UDP作为传输协议,主机发送请求消息到DHCP服务器的67号端口,DHCP服务器回应应答消息给主机的68号端口。
DHCP获得 ip 地址的 4 步骤:discover>offer>request>ack(nak)
DHCP刷新租期的步骤:request>ack(nak)
DHCP释放 ip 的步骤:release
续租:
在使用租期超过50%时刻处,DHCP Client会以单播形式向DHCP Server发送DHCPRequest报文来续租IP地址。如果DHCP Client成功收到DHCP Server发送的DHCP ACK报文,则按相应时间延长IP地址租期;如果没有收到DHCP Server发送的DHCP ACK报文,则DHCP Client继续使用这个IP地址。
在使用租期超过87.5%时刻处,DHCP Client会以广播形式向DHCP Server发送DHCPRequest报文来续租IP地址。如果DHCP Client成功收到DHCP Server发送的DHCP ACK报文,则按相应时间延长IP地址租期;如果没有收到DHCP Server发送的DHCP ACK报文,则DHCP Client继续使用这个IP地址,直到IP地址使用租期到期时,DHCP Client才会向DHCP Server发送DHCP Release报文来释放这个IP地址,并开始新的IP地址申请过程。
报文格式
op:报文类型,1表示请求报文,2表示回应报文.
htype:硬件类别,Ethernet为1.
hlen:硬件地址长度,Ethernet为6.
hops:DHCP报文经过的DHCP中继的数目,默认为0。DHCP请求报文每经过一个DHCP中继,该字段就会增加1。没有经过DHCP中继时值为0。
xid:TRANSACTION ID,客户端选择的一个随机数,用于匹配DHCP 请求和应答。
secs:由客户端填写,DHCP客户端从获取到IP地址或者续约过程开始到现在所消耗的时间,以秒为单位。在没有获得IP地址前该字段始终为0。
flags:B为广播标记,0表示单播,1表示广播,其余保留。
ciaddr:DHCP客户端的IP地址。仅在DHCP服务器发送的ACK报文中显示,在其他报文中均显示0。
yiaddr:DHCP服务器分配给客户端的IP地址。仅在DHCP服务器发送的Offer和ACK报文中显示,其他报文中显示为0。
siaddr:下一个为DHCP客户端分配IP地址等信息的DHCP服务器IP地址。仅在DHCP Offer、DHCP ACK报文中显示,其他报文中显示为0。
giaddr:DHCP客户端发出请求报文后经过的第一个DHCP中继的IP地址。如果没有经过DHCP中继, 则显示为0。
chaddr:client hardware address DHCP客户端硬件地址
sname:为DHCP客户端分配IP地址的DHCP服务器名称(DNS域名格式),以0x00结尾。在Offer和ACK报文中显示发送报文的DHCP服务器名称,其他报文显示为0。
File:DHCP服务器为DHCP客户端指定的启动配置文件名称及路径信息。仅在DHCP Offer报文中显示,其他报文中显示为空。
options: