网络协议介绍

TCP/IP协议

参考文档
协议分层
tcp三次握手建立连接
server端收到client发送的syn请求,将连接放入请求队列,发送syn/ack请求,等待client 响应ack,此时处于半连接状态(SYN_RCVD状态),收到client ack后,状态变为establish,此时进入到socket的accept()方法。
tcp四次挥手断开链接
四次挥手断开连接保证server的数据能完整传输给client
client time_wait状态会经过2MSL(最大报文段生存时间)才能返回到CLOSE状态,如果立即关闭,新建立的连接有可能会使用刚断开的端口号,此时特殊情况下网络中滞留的上次连接的数据,可能被当成此次连接的数据被server接收,导致数据混淆,所以client time_wait状态持续2msl后,等网络中的数据全部消失后,再变为closed状态。
* MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒,因而,TIME_WAIT状态一般维持在1-4分钟。
端口用16位(2b)来存储,端口范围为0-65525(2^16-1)

  • 服务器出现大量time_wait状态的网络链接,通常是大量的短链接请求关闭,一般发生在client端(因为一般链接由客户端断开,如果server端先断开,则server端的状态为time_wait)
    1. 查看应用链接,看有没有可能改成长连接,如http的keep-alive=true
    2. 调整Linux内核参数(不建议,可临时解决),reuse(允许time_wait的用于新连接)、开启快速回收time_wait(recycle)、改小回收时间tcp_fin_time。参考文章
      time_wait调整内核参数
  • 服务器大量close_wait状态,客户端发送fin,服务端长时间为关闭连接,系统自动关闭close_wait连接的时间很长(2h):
    1. 通常是服务端业务逻辑有问题,没有及时close连接,当read返回-1时,应该close连接;或者开启数据库事务后,由于异常等原因没有commit或者rollback,导致数据库server主动断开连接,client进入close_wait但没有给响应。

udp是面向无连接的传输协议,可以一对多、多对一、多对多,整个数据包发送,不会拆包。

http协议是基于tcp协议构建的应用层协议,包含请求方法、url、协议版本号、请求头、请求内容。

http与https

单向认证的密钥交换过程
参考文章

ping协议

分层典型概念常见协议设备
链路层mac地址arp交换机
网络层ip地址icmp路由器、网关
传输层porttcp/udp
应用层进程、线程http、ftp、ping、dns

参考文章
ping本身是工作在应用层的协议,用于判断与对方网络是否畅通。分为同一网段内和跨网段两种情况:
1.同一网段内: ping先查询arp缓存表(mac-ip映射表),如果没有则发送arp广播包,交换机收到这个报文后,它会学习到A的MAC和入端口号并保存在MAC地址表中(MAC-port映射)。交换机会向所有端口发送arp广播包,非请求目标ip的主机接收到arp广播包会丢弃,目标ip主机返回mac信息。(路由器会隔离广播域,一般会丢弃广播包,除非开启了代理arp功能)
2. 跨网段:首先通过arp学习到网关的mac,然后发送icmp报文,路由器接收到icmp报文,查找路由表(如果路由表中没有,路由器也通过arp的方式学习目标ip的mac地址),找到出端口,修改请求mac为路由器mac,向目标ip主机发送icmp报文,目标ip主机响应icmp报文
3. ping域名:需要根据域名依次查找本地dns缓存、路由dns缓存、本地dns服务器、根域名服务器、顶级域名服务器,获取到域名对应的ip,然后通过arp、icmp的方式完成ping调用 参考文章

其他网络协议

网络协议
协议名称

  • 各种协议所在的层次和默认端口,增加层面为了耦合性降低,tcp/ip协议简化了层次
    http:web服务,页面传输,80
    ftp: 20控制数据、21文件数据,交互,一般需要登录
    telnet明文传用户名密码,可靠但不安全;windows远程桌面
    POP3:邮件收取协议
    SMTP:邮件传输协议,25
    DNS:域名解析
    DHCP:动态地址分配,cs架构
    SNMP:简单网络管理,网络管理
    TFTP:简单文件传输协议
    ICMp:差错校验,ping命令基于ICMP
    IGMP:G:group 组播协议
    ARP:ip找mac地址
    RARP:mac找ip
    Tokingring:令牌环协议
    Csma/cd:3g 4g接入协议

select poll epoll多路复用

select 数组存储链接(有限链接),轮询、用户态、内核态、用户态的复制
poll 链表存储链接(链接的数量不限)。轮询、用户态、内核态、用户态的复制
epoll 采用红黑树存链接,当内核监测到网卡转换为读、或写就绪状态时,把链接从红黑树存放到就绪链表,回调应用,通过事件监听的模式
多路复用对比

[参考文章](https://blog.csdn.net/weixin_44273302/article/details/115269745)

BIO/NIO/AIO

BIO(同步阻塞IO)

  • 一个链接一个线程
  • 【BIO】现在烧水,意味着你现在需要一直盯着水壶去看,一直看它已经烧为止,在这之中你什么都干不了。
// bio 核心类
java.net.ServerSocket
java.net.Socket

NIO(同步非阻塞IO)

  • 一个请求一个线程(jdk4)
  • NIO之中采用了一个Reactor事件模型,注册的汇集点Selector
  • 采用线程轮询方式,一个selector可以轮询多个channel;多路复用
  • 【NIO】烧水,不会一直傻站着看,你采用轮询的方式来观察水是否烧开。
    NIO selector多路复用
// nio 核心类
java.nio.channels.ServerSocketChannel
java.nio.channels.SocketChannel
java.nio.channels.Selector
java.nio.channels.SelectionKey
java.nio.ByteBuffer
  • Buffer缓存
    nio buffer缓存
    Position指向要操作的位置,
    Limit指向终止位置,
    Capacity指定容量

ByteBuffer.allocate(50)分配缓存, position指向开始位置;limit指向最后;
.clear() position指向开始位置;limit指向最后;
buffer.put(writeMessage.getBytes())或clientChannel.read(XX,buffer),向buffer中写入,position指针向后移动,limit不动;
buffer.flip()重置缓冲区,position指针到最开始,limit到当前有数据的最后一位;
clientChannel.write(buffer)将buffer postion到limit的数据写入channel

  • selector可以轮询到四种状态
    轮询到后可以选择对应的处理方式,下面的例子仅处理了OP_ACCEPT对应的操作,为创建服务端线程,接收客户端请求,并作出相应。
    selector轮询四种状态
    nio server代码
    server
    nio client 代码:
    client

AIO(异步非阻塞IO)

  • 一个有效请求一个线程(jdk7)
  • 是利用了本地操作系统的IO操作处理模式,当有IO操作产生之后,会启动有一个单独的线程,它将所有的IO操作全部交由系统完成,只需要知道返回结果即可。
  • 主要的模式是基于操作回调的方式来完成处理的,如果以烧水为例:在烧水的过程之中你不需要去关注这个水的状态,在烧水完成后才进行通知
  • 应用程序向操作系统注册IO监听,然后继续做自己的事情。操作系统发生IO事件,并且准备好数据后,在主动通知应用程序,触发相应的函数(这就是一种以订阅者模式进行的改造)。由于应用程序不是“轮询”方式而是订阅-通知方式,所以不再需要selector轮询,由channel通道直接到操作系统注册监听。(应用注册监听,操作系统回调
    aio 调用流程
// aio 核心类
java.nio.channels.AsynchronousServerSocketChannel
java.nio.channels.AsynchronousSocketChannel
java.nio.channels.CompletionHandler
java.util.concurrent.CountDownLatch
java.nio.ByteBuffer

netty

netty参考文章

  • java netty 框架基于nio通信方式,基于selector多路复用,底层有select、poll、epoll的实现
  • Netty是基于NIO实现的,也采用了线程池的概念。
  • Netty是基于NIO的实现,是基于状态的处理形式,例如:连接成功、信息的读取、失败等操作都会由一系列的状态方法来进行定义的。
    netty核心组件如下:
    netty 核心组件
  1. Channel:用于网络通信的通道,可以理解为Java NIO中的SocketChannel
  2. ChannelFuture:异步操作的结果,可以添加监听器以便在操作完成时得到通知。
  3. EventLoop:事件循环器,用于处理所有I/O事件和请求。Netty的I/O操作都是异步非阻塞的,它们由EventLoop处理并以事件的方式触发回调函数。
  4. EventLoopGroup:由一个或多个EventLoop组成的组,用于处理所有的Channel的I/O操作,可以将其看作是一个线程池。
  5. ChannelHandler:用于处理Channel上的I/O事件和请求,包括编码、解码、业务逻辑等,可以理解为NIO中的ChannelHandler
  6. ChannelPipeline:由一组ChannelHandler组成的管道,用于处理Channel上的所有I/O 事件和请求,Netty中的数据处理通常是通过将一个数据包装成一个ByteBuf对象,并且通过一个 ChannelPipeline来传递处理,以达到业务逻辑与网络通信的解耦。
  7. ByteBuf:Netty提供的字节容器,可以对字节进行高效操作,包括读写、查找等。
  8. Codec:用于在ChannelPipeline中进行数据编码和解码的组件,如字符串编解码器、对象序列化编解码器等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值