Skip to content

NIO HTTP Protocol

javahongxi edited this page Aug 3, 2019 · 4 revisions

网络七层模型

img

  • Java里面的Socket/DatagramSocket便是对传输层的表现
  • 应用层协议分为公有协议和私有协议,公有协议是经过国际或国家标准化组织采纳或批准的协议,如HTTP、FTP、WebSocket等,私有协议则是自定义协议,如dubbo协议等。绝大多数的私有协议传输层都基于TCP/IP,所以利用Netty的 NIO TCP 协议栈可以非常方便地进行私有协议的定制和开发。

HTTP协议介绍

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":[]}])

HTTP消息头参数说明

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

Netty HTTP 使用

https://github.com/javahongxi/whatsmars/tree/master/whatsmars-rpc/whatsmars-netty

首页

Java核心技术

Netty

RocketMQ深入研究

kafka深入研究

Pulsar深入研究

Dubbo源码导读

微服务架构

Redis

Elasticsearch

其他

杂谈

关于我

Clone this wiki locally