netty 网络模型
网络模型
tcp/ip 4层模型:应用层、传输层、网络层、网络接口层
tcp/ip 5层模型:应用层、传储层、网络层、数据链路层、物理层
osi 7层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
网络分层协议
应用层:http(超文本传输协议)、DNS(域名解析协议)、ftp(文件传输协议)、smtp(邮件传输协议)等
传输层:tcp协议、udp协议
网络层:ip协议、arp协议
数据链路层:以太网协议
物理层:无协议,根据电气特性发送高低电平信号(高电平1、低电平0)
传输层
************
udp 报文
端口:源端口、目的端口,占16位,取值范围0-65535
长度:报文总长度,占16位,最大长度65536字节
校验和:发送发、接收方校验和如果不一致则表示传输出错,upd会将消息丢弃
************
tcp 报文
端口号:源端口、目的端口,占16位,取值范围0-65535
序号、确认号:占32位
序号:报文段的第一个字节序号,若本报文段占100个字节,此次发送的序号为300,则下一个报文段发送的序号为400
确认号:本通信端期待下一次收到的字节序号,通信端已经收到对方传来的字节序号为300,收到的报文段长度为100,则确认号位400
数据偏移:数据区在报文段中的起始偏移,占4位
报文头部可能包含可选项内容
如果不包含可选项,报头长度为20字节;
如果包含可选项,报头长度最长为15*32/8=60字节
保留:为将来定义新的用途保留,占6位
标志位:每个标志位都表示一个控制功能,占1位,总共占6位
URG:紧急指针标志位,为1表示紧急指针有效
ACK:确认序号标志位,为1表示确认报中含有确认信息
PSH:接受信号标志位,为1表示带有PUSH信号,接收方接到报文后,尽快交到应用程序处理,不要放在缓冲区
RST:重置信号标志位,为1表示带有重置信号,用于重置由于诸暨崩溃或者其他原因出现的错误连接、拒绝非法报文段连接请求
SYN:同步序号标志位,位1表示带有同步信号,
连接建立时,请求方发送报文:SYN=1、ACK=0,
接收方接受连接,发送应答报文:SYN=1、ACk=1
FIN:连接释放报文,为1表示数据传送完毕,没有数据发送,关闭本方发送流
窗口:滑动窗口,占16位,告知发送端接受端的缓存大小,用来控制发送端发送速率,实现流量控制
校验和:校验整个报文段(报文头、数据),占16位,由发送发计算和存储,接受端进行认证
紧急指针:标志位URG=1时有效,和序号相加表示紧急数据最后一个字节,实现发送发项接受方发送方发紧急数据,占16位
选项和填充
选项:长度可变,可选值很多(常见选项最长报文大小MSS)
MSS:最长报文大小,第一次建立连接时,可携带这个选项,表示本端能接受的最长发送报文大小
填充:选项不一定是32的整数倍,加填充项确保是32个整数倍
数据部分:报文段数据
************
tcp 连接
三次握手
# 第一次握手
客户端发送连接请求:SYN=1、seq=x(SYN报文不携带数据,但会消耗一个序列号),
客户端进入同步发送状态(SYN_SENT),等待服务端确认
# 第二次握手
服务度端接到连接请求,确认客户端连接请求:SYN=1、ACK=1、seq=y、
ack=x+1(此处表示服务端期望下一次收到客户端的序列号位x+1),
服务端进入连接同步接收状态(SYN_RECV)
# 第三次握手
客户端收到服务端同步确认报文,进入连接建立状态(ESTABLISGED),
并向服务端发送确认报文:ACK=1、seq=x+1、ack=y+1(表示客户端期望下一个收到服务端的序列号位y+1)
说明:SYN=1报文消耗一个序列号,ACK=1报文不消耗序列号
数据传输
四次挥手
# 第一次挥手
客户端发送连接释放报文:FIN=1、seq=u,
客户端进入终止等待(FIN_WAIT_1)状态,此后,客户端不会向服务端发送任何数据
# 第二次挥手
服务端接到客户端连接关闭报文,发出确认报文:ACK=1、seq=v、ack=u+1,
服务端进入关闭等待(CLOSE_WAIT)状态
客户端接到服务端确认报文后,进入FIN_WAIT_2状态;
# 数据传输
服务端可能还有一些数据需要向客户端发送;
# 第三次挥手
服务端向客户端发送连接释放报文:FIN=1、ACK=1、
seq=z(由于服务端向客户端发送了一些数据,导致序列号变化)
ack=u+1
服务器进入LAST_ACK状态,等待客户端确认
# 第四次挥手
客户端接到连接释放报文,发出确认报文:ACK=1、seq=u+1、ack=z+1
此时客户端进入TIME_WAIT状态,time_wait等于2MSL(最长报文寿命),
在2MSL后,撤销传输控制快(TCB)后,进入关闭状态
服务端收到确认报文后,立刻撤销传输控制块(TCB),进入关闭状态
说明:FIN=1报文即使不携带数据,也会消耗一个序列号
************
tcp、udp区别
tcp 协议
面向连接:通信之前需要建立连接
可靠传输:tcp传输的数据无差错、不丢失、不重复,且前后有序
点对点:tcp传输是一对一传输
传输效率:tcp连接建立、释放耗时,传输需要对数据进行检验,丢失需要重传,实时性较低
udp 协议
无连接传输:udp传输不需要建立连接
不可靠传输:udp尽最大努力交付,不保证可靠性,会发生丢包现象
传输方式:可一对一、一对多、多对一、多对多传输
实时性:udp传输效率较高,实时性较tcp高
************
通信端口
tcp、udp端口均占16位,最大值为65535
0-1023:系统保留端口
1024-49152:用户可注册端口
49153-65535:动态端口
网络层
网络层引入网络地址区分网络设备是不是处于同一子网内
ip 地址:网络部分 + 主机部分,只有ip地址无法区分网络部分、主机部分
子网掩码:与ip地址搭配使用,用来标识ip地址哪些位置是网络部分(网络部分全为1)
判断ip地址是否处于同一子网:ip和子网掩码做与运算(&)
运算结果相同则处于同一子网
ip 数据包格式
版本:ip版本号,占4位,4表示ipv4,6表示ipv6
首部长度:占4位,固定长度为20个字节,最长60个字节(15*32/8)
区分服务:占8位,只有在区分服务时,这个字段才起作用,一般不使用
总长度:首部+数据总长度,占16位,最长为2^16-1=65535字节
链路层协议规定了一个数据帧的数据字段的最大长度(MTU)为1500字节,如果超过这个长度,需要分片处理
标识:占16位,每产生一个数据包,计数器加1,并将该值在标识位记录,
如果ip分片,同一个报文分片后的报文标识相同,可用于后续数据还原
标志:占3位,第1位(未使用)
第2位(是否允许分片,0允许分片、1不允许分片)
第3位(是否有分片正在传输,0表示没有分片在传输)
片偏移:占13位,报文被分片后,该字段标记该分片在原报文中的相对位置,偏移以8字节为单位,
生存时间:数据报在网络中的寿命,占8位,
路由器在转发数据报之前,先把TTL值减1
若TTL减少到0,则丢弃这个数据报,不再转发
协议:该数据报文所携带的数据所使用的协议类型,占8位
方便目的主机的 IP 层知道按照什么协议来处理数据部分,
ICMP协议号为1,TCP协议号为6,UDP协议号为17
首部检验和:校验数据报的首部(不包含数据部分),占16位
数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验
数据部分不发生变化,所以不用重新生成校验值
源地址:数据报的源IP地址,占32位
目的地址:数据报的目的IP地址,占32位
可选字段:用于一些可选的报头设置,主要用于测试、调试和安全的目的
填充:可选字段中长度不固定,使用0填充,保证整个报头的长度是32位的整数倍
数据部分:传输的数据,如保存TCP、UDP、ICMP、IGMP的数据,长度不固定
ip 分片(片偏移以8字节为单位)
ARP 协议:地址解析协议,实现从IP地址到MAC地址映射
hardware type:硬件类型,标识链路层协议
protocol type:协议类型,标识网络层协议
hardware size:mac地址长度,6字节(48位)
protocol sixe:ip地址长度
opreate code:操作码,标识arp数据包新类型,1标表示请求,2表示响应
sender mac address:发送端mac地址
sender ip addrese:发送端ip地址
target mac address:目的mac地址
target ip address:目的ip地址
说明:arp报文只能在局域网内传输,不能路由转发到其他子网
arp 请求报文示例
arp 响应报文示例
主机A、B通信过程
主机A:ip(10.0.0.1)、mac(00:09:aa:11)
主机B:ip(10.0.0.2)、mac(00:09:aa:22)
根据ip、子网掩码计算主机是否在同一子网内
# 主机在同一子网
主机A在arp缓存中查找主机B的mac地址,如果查找到,就可直接发送数据;
如果查找不到,广播arp请求帧给子网内的所有主机;
其他主机接到请求帧,如果ip地址不是本机地址,则忽略请求;
如果ip地址是本机地址,缓存源主机(主机A)的IP地址、mac地址,并将本机的mac地址返回
主机A收到响应报文后,缓存对应的mac地址,随后就可直接与其通信;
arp缓存有时间限制,缓存到期后,重复上述过程
# 主机在不同子网
主机A在arp缓存中查找网关的mac地址,如果查找到,就可直接向网关发送数据;
如果查找不到,广播arp请求帧给子网内的所有主机;
查询得到结果后,主机A后将<网关IP、网关MAC>、<主机B、网关MAC>缓存
主机A项网关发送IP报文,网关收到报文后,发现IP不是自己;
就在缓存中查找主机B的mac地址,如果没有找到,则在主机B所在网段进行ARP查询;
查询后将主机B、主机B的mac地址缓存;
网关向主机B发送IP数据报,
请求报文:源MAC=网关、源IP=主机A,目的MAC、目的IP=主机B
主机B收到报文后,将主机A的IP、主机A所在网关缓存起来
数据链路层
链路层协议:定义电平信号分组方式,单纯的电平信号没有任何意义,需要分组表达不同的意思
mac 地址:接入网络的设备不需配备网卡,发送端、接受端的地址就是mac地址
地址格式:48位,一般用12位16进制表示(前6位是厂商编号、后6位是流水线号)
以太网数据帧:head固定为18个字节,data长度可变(46-1500字节)
局域网通信方式:广播通信
同一子网内,pc1项pc2发送数据,同一子网的其他设备都会接到数据包;
其他设备接到数据包后,解析数据包中的mac地址,发现不是自己的地址便会丢弃;
pc2收到数据包,解析后发现是自己的mac地址,便会做出响应
网络数据传输
数据封装
应用层:使用DNS解析域名得到IP地址,生成应用报文(如http报文)
传输层:包装应用层的数据,生成传输层协议头(端口等),使用传输层协议发送数据(如tcp协议)
网络层:包装传输层数据,生成网络层协议头(ip等),由于ip报文有长度限制,可能需要对数据进行ip分片
数据链路层: 包装网络层数据,生成链路层协议头(mac地址等)
数据传输:客户端发送数据包,如果不在同一子网内,需要网络层路由转发
服务端处理:服务端接到数据后,从链路层往上层层解析,应用层取出数据后处理后;
如果有响应,还需要将应用层数据层层包装,发送给客户端