-
Notifications
You must be signed in to change notification settings - Fork 610
NIO HTTP Protocol
- Java里面的Socket/DatagramSocket便是对传输层的表现
- 应用层协议分为公有协议和私有协议,公有协议是经过国际或国家标准化组织采纳或批准的协议,如HTTP、FTP、WebSocket等,私有协议则是自定义协议,如dubbo协议等。绝大多数的私有协议传输层都基于TCP/IP,所以利用Netty的 NIO TCP 协议栈可以非常方便地进行私有协议的定制和开发。
HTTP(超文本传输协议)协议是建立在TCP传输协议之上的应用层协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
HTTP协议的主要特点如下:
- 支持Client/Server模式
- 简单————客户向服务器请求服务时,只需要指定服务URL,携带必要的请求参数或者消息体
- 灵活————HTTP允许传输任意类型的数据对象,传输的内容类型由HTTP消息头中的Content-Type加以标记
- 无状态————HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要之前的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快,负载较轻。
HTTP请求由三部分组成:
- HTTP请求行
- HTTP消息头
- HTTP请求正文(消息体)
HTTP响应消息也由三部分组成
- 状态行
- 消息报头
- 响应正文
下面是抓包获取的请求和响应:
GET /lab/get?callback=lab HTTP/1.1
Host: d.jd.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
Accept: */*
Referer: https://www.jd.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7
Cookie: __jda=76161171.1564630620764743965844.1564630621.1564630621.1564630621.1; __jdc=76161171
HTTP/1.1 200 OK
Date: Thu, 01 Aug 2019 03:48:49 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Vary: Accept-Encoding
cache: dict
Cache-Control: max-age=62
Expires: Thu, 01 Aug 2019 03:49:51 GMT
Content-Encoding: gzip
Server: jfe
Connection: close
lab([{"id":1417,"url":"www.jd.com","startOn":1562342400000,"endOn":1562860800000,"percent":"20","skus":[]}])
Connection 表示是否需要持久连接。如果web服务器端看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点, web服务器需要在返回给客户端HTTP头信息中发送一个Content-Length(返回信息正文的长度)头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然 后在正式写出内容之前计算它的大小。 实例:Connection: keep-alive
Keep-Alive 显示此HTTP连接的Keep-Alive时间。使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。以前HTTP请求是一站式连接,从HTTP/1.1协议之后,就有了长连接,即在规定的Keep-Alive时间内,连接是不会断开的。 实例:Keep-Alive: 300
https://github.com/javahongxi/whatsmars/tree/master/whatsmars-rpc/whatsmars-netty
wiki.hongxi.org
首页
Java核心技术
- JUC JMM与线程安全
- JUC 指令重排与内存屏障
- JUC Java内存模型FAQ
- JUC 同步和Java内存模型
- JUC volatile实现原理
- JUC AQS详解
- JUC AQS理解
- JUC synchronized优化
- JUC 线程和同步
- JUC 线程状态
- JUC 线程通信
- JUC ThreadLocal介绍及原理
- JUC 死锁及避免方案
- JUC 读写锁简单实现
- JUC 信号量
- JUC 阻塞队列
- NIO Overview
- NIO Channel
- NIO Buffer
- NIO Scatter与Gather
- NIO Channel to Channel Transfers
- NIO Selector
- NIO FileChannel
- NIO SocketChannel
- NIO ServerSocketChannel
- NIO Non-blocking Server
- NIO DatagramChannel
- NIO Pipe
- NIO NIO vs. IO
- NIO DirectBuffer
- NIO zero-copy
- NIO Source Code
- NIO HTTP Protocol
- NIO epoll bug
- Reflection 基础
- Reflection 动态代理
- JVM相关
- 设计模式典型案例
Netty
RocketMQ深入研究
kafka深入研究
Pulsar深入研究
Dubbo源码导读
- Dubbo SPI
- Dubbo 自适应拓展机制
- Dubbo 服务导出
- Dubbo 服务引用
- Dubbo 服务字典
- Dubbo 服务路由
- Dubbo 集群
- Dubbo 负载均衡
- Dubbo 服务调用过程
微服务架构
Redis
Elasticsearch
其他
- Dubbo 框架设计
- Dubbo 优雅停机
- dubbo-spring-boot-starter使用指南
- rocketmq-spring-boot-starter使用指南
- Mybatis multi-database in spring-boot 2
- RocketMQ 客户端简单封装
- Otter 入门
杂谈
关于我