RTMP协议
- 格式:doc
- 大小:122.50 KB
- 文档页数:11
RTMP协议分析及推流过程1.RTMP(实时消息传输协议)是Adobe 公司开发的⼀个基于TCP的应⽤层协议。
2.RTMP协议中基本的数据单元称为消息(Message)。
3.当RTMP协议在互联⽹中传输数据的时候,消息会被拆分成更⼩的单元,称为消息块(Chunk)。
RTMP 握⼿(Handshake):1.握⼿开始于客户端发送C0、C1块。
服务器收到C0或C1后发送S0和S1。
2.当客户端收齐S0和S1后,开始发送C2。
当服务器收齐C0和C1后,开始发送S2。
3.当客户端和服务器分别收到S2和C2后,握⼿完成。
在实际⼯程应⽤中,⼀般是客户端先将C0, C1块同时发出,服务器在收到C1 之后同时将S0, S1, S2发给客户端。
之后客户端向服务器端发送C2块,简单握⼿完成。
建⽴⽹络连接(NetConnection):1. 客户端发送命令消息中的“连接”(connect)到服务器,请求与⼀个服务应⽤实例建⽴连接。
2. 服务器接收到连接命令消息后,发送确认窗⼝⼤⼩(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应⽤程序。
3. 服务器发送设置带宽协议消息到客户端。
4. 客户端处理设置带宽协议消息后,发送确认窗⼝⼤⼩(Window Acknowledgement Size)协议消息到服务器端。
5. 服务端向客户端发送“流开始”(Stream Begin)。
6. 服务器发送命令消息中的“结果”(_result),通知客户端连接的状态。
建⽴⽹络流(Create Stream):1. 客户端发送命令消息中的“创建流”(CreateStream)命令到服务器端。
2. 服务器端接收到“创建流”命令后,发送命令消息中的“结果”(_result),通知客户端流的状态。
播放(Play):1. 客户端发送命令“播放”给服务器2. 接收到播放命令后,服务器发送设置块⼤⼩(ChunkSize)协议消息给客户端3. 服务器发送“stream begin”给客户端,告诉客户端流的id4. 播放命令成功的话,服务器发送命令消息中的“响应状态” NetStream.Play.Start & NetStream.Play.Reset,告知客户端“播放”命令执⾏成功5. 服务器发送客户端要播放的⾳频和视频数据⼩结:关系图:播放⼀个RTMP协议的流媒体需要经过以下⼏个步骤:下⾯⽤wireshark 抓包来分析⼀下过程:RTMP 消息结构:RTMP消息块:在⽹络上传输数据时,消息需要被拆分成较⼩的数据块,才适合在相应的⽹络环境上传输。
rtmp协议第一篇:RTMP协议的基础概念及特点RTMP(Real Time Messaging Protocol)是一种实时消息传递协议,属于Adobe公司开发的一种流媒体协议。
RTMP 协议使用TCP进行数据传输,适用于音视频流的实时播放、互动、互传等方面,被广泛应用于视频直播、在线教育、网络会议等领域。
RTMP协议具有以下特点:1. 实时传输:RTMP协议传输数据的速度非常快,能够满足实时传输音视频流的要求。
2. 跨平台:RTMP协议支持多种操作系统和平台,包括Windows、Mac OS X、Linux等。
3. 支持多种编码方式:RTMP协议支持多种编码方式,如H.264、VP6、Sorenson Spark等,可以适应不同的数据类型和网络环境。
4. 安全性高:RTMP协议支持加密传输,可以保证数据的安全性。
5. 支持多种传输方式:RTMP协议支持多种传输方式,包括点对点传输、客户端和服务器之间的传输等。
6. 支持多种数据格式:RTMP协议支持多种数据格式,如FLV、MP4等,可以适应不同的数据类型和网络环境。
总之,RTMP协议具有高效、可靠、跨平台、安全等特点,是现今流媒体传输的主流协议之一。
第二篇:RTMP协议的工作原理及实现RTMP协议的工作原理是,客户端向服务器发送连接请求,并进行握手验证,验证通过后,建立连接,开始实时传输数据。
在建立连接后,客户端可以向服务器发送控制信息、元数据和音视频数据。
控制信息包括连接控制、流控制、消息控制等,用于控制数据的传输。
元数据包含音视频的标题、格式、描述等信息。
音视频数据则包含音视频的编码数据。
RTMP协议的传输方式有三种:直接传输、容器传输和点对点传输。
直接传输和容器传输都是通过服务器进行流媒体传输,只不过采用的传输方法不同。
点对点传输则是直接将数据传输到接收端,实现点对点传输。
实现RTMP协议需要以下步骤:1. 与服务器建立连接首先需要与服务器建立连接,进行握手验证,验证通过后方可进入数据传输阶段。
RTMP协议协议名称:RTMP协议一、引言RTMP(Real-Time Messaging Protocol)是一种用于实时数据传输的协议,最初由Adobe公司开发,用于在Flash平台上实现音视频流的传输。
RTMP协议可以通过传输控制协议(TCP)在客户端和服务器之间进行数据传输,支持实时音视频流的传输和即时通讯功能。
二、协议目的RTMP协议的目的是确保高效、稳定、实时的音视频传输和即时通讯功能。
通过该协议,用户可以在客户端和服务器之间传输实时音视频流,并实现实时的双向通讯。
三、协议范围本协议适用于所有使用RTMP协议进行实时音视频传输和即时通讯的应用场景,包括但不限于在线直播、视频会议、游戏实时通讯等。
四、术语定义1. RTMP:Real-Time Messaging Protocol的缩写,即实时消息传输协议。
2. 客户端:指使用RTMP协议进行数据传输的终端用户设备。
3. 服务器:指提供RTMP服务的服务器端设备。
五、协议内容1. 连接建立1.1 客户端通过TCP连接与服务器建立连接。
1.2 客户端发送连接请求到服务器,请求中包含握手信息。
1.3 服务器收到连接请求后,验证握手信息的合法性。
1.4 服务器发送握手响应到客户端,确认连接建立成功。
2. 数据传输2.1 客户端发送音视频流数据到服务器,数据格式为FLV(Flash Video)。
2.2 服务器接收音视频流数据,并进行解码处理。
2.3 服务器将解码后的音视频流数据发送给客户端。
2.4 客户端接收音视频流数据,并进行播放或显示。
3. 控制消息3.1 客户端和服务器之间通过控制消息进行交互。
3.2 控制消息包括连接控制、流控制、用户控制等。
3.3 连接控制消息用于管理连接的建立、断开和状态维护。
3.4 流控制消息用于管理音视频流的传输和控制。
3.5 用户控制消息用于控制音视频流的播放、暂停、停止等操作。
4. 安全性4.1 RTMP协议支持加密传输,可使用SSL/TLS协议进行数据加密。
rtmp协议
RTMP协议是一种用于传输音视频流的协议。
它被广泛应
用于直播、视频会议等领域。
RTMP协议使用了TCP作为传输
协议,并且支持多种编码格式。
RTMP协议的传输方式分为两种:直接传输和隧道传输。
直接传输方式是指音视频数据通过TCP直接传输。
隧道传输方式是指音视频数据被封装成RTMP数据包后,通过HTTP或HTTPS协议传输,接收端再将其解包。
RTMP协议中涉及到的一些概念包括:RTMP URL、RTMP消息、RTMP Chunk等。
RTMP URL是指包含协议、主机名、端口
号和应用名称等信息的URL字符串。
RTMP消息是指RTMP协议
中传输的信息,它包含了消息类型、时间戳等信息。
RTMP Chunk是指将RTMP消息进行分块后的数据块,用于在传输过
程中进行拆分和组装。
RTMP协议中包含了多种消息类型,包括连接建立、控制
消息、音视频数据等。
其中,控制消息包含了流控制、窗口大小调整等功能。
音视频数据则需要经过音视频编码器进行编码,然后再进行传输。
在实际应用中,RTMP协议一般用于直播、视频会议等领域。
对于直播来说,RTMP协议可以将视频数据实时传输到服
务器,然后再通过HTTP或HTTPS协议分发给用户。
同时,RTMP协议还提供了多种流媒体控制功能,可以对音视频数据
进行控制、调整。
总之,RTMP协议是一种非常重要的音视频传输协议,它
的广泛应用为直播、视频会议等领域提供了了更加便捷、实时、高效的传输方式。
RTMP协议RTMP(Real-Time Messaging Protocol)是一种用于音频、视频和数据传输的协议。
它最初是由Adobe Systems开发,用于在Flash平台上进行实时通信和流媒体传输。
RTMP协议支持实时的音视频传输,可以在互联网上进行高效的视频直播和互动。
概述RTMP协议是一种基于TCP的协议,它通过三个不同的通道进行数据传输:命令通道、音频通道和视频通道。
这种分离的通道使得音视频数据可以独立传输,实现了低延迟、高质量的实时传输。
RTMP协议的特点1. 实时性RTMP协议通过优化传输方式和缓存机制,能够实现低延迟的音视频传输。
这使得它在直播、视频会议等实时场景下得到广泛应用。
2. 强大的流媒体支持RTMP协议支持流媒体传输,可以在互联网上进行高效的视频直播和点播。
它能够根据客户端的带宽情况,动态调整视频的码率和分辨率,保证最佳的观看体验。
3. 安全性RTMP协议可以通过加密和身份验证等方式来保护数据的安全性。
它支持RTMPS(RTMP over SSL/TLS)协议,可以在传输过程中对数据进行加密,防止数据被窃取或篡改。
RTMP协议的工作流程RTMP协议的工作流程可以简单描述为以下几个步骤:1.客户端与服务器建立TCP连接。
2.客户端发送握手请求,服务器返回握手响应。
3.客户端和服务器进行握手确认。
4.客户端发送命令消息,服务器执行相应的操作。
5.客户端发送音频和视频数据,服务器进行解码和处理。
6.服务器将音频和视频数据发送给其他客户端或进行存储。
7.客户端接收到音频和视频数据,进行解码和播放。
RTMP协议的应用场景1. 视频直播RTMP协议在视频直播领域有着广泛的应用。
通过RTMP协议,用户可以将自己的视频内容实时传输到服务器,并且其他用户可以通过使用RTMP协议进行接收和播放。
2. 视频会议RTMP协议支持实时的音频和视频传输,因此在视频会议中也得到了广泛应用。
用户可以通过RTMP协议进行实时的音视频通话,实现远程会议和协作。
直播技术的流媒体传输协议常见的直播流媒体传输协议介绍直播技术在现代社交媒体中的应用越来越广泛,为了实现高质量的流媒体传输,直播平台借助各种流媒体传输协议。
本文将介绍几种常见的直播流媒体传输协议,并对其特点进行分析。
一、RTMP协议RTMP(Real-Time Messaging Protocol)是一种实时消息传输协议,由Adobe开发。
它采用基于TCP的传输方式,在互联网传输中表现出良好的稳定性和实时性。
RTMP协议通过将音频、视频及元数据打包成小块传输,保证了传输的流畅性和稳定性。
RTMP协议被广泛应用于实时直播领域,尤其在低延迟的直播环境下表现出色。
二、HLS协议HLS(HTTP Live Streaming)协议是由Apple提出的流媒体传输协议。
HLS协议基于HTTP协议,将整个视频分成多个小的TS (Transport Stream)文件,通过HTTP协议逐个传输。
HLS协议适应性强,支持多种终端设备播放,并且能够自适应网络环境的变化。
这使得HLS成为了许多直播平台的首选协议。
三、DASH协议DASH(Dynamic Adaptive Streaming over HTTP)协议是一种动态自适应流媒体传输协议,由MPEG联盟制定。
DASH协议无需握手过程,通过HTTP协议动态获取数据,根据客户端自身的网络情况和解码能力选择相应的码率和片段进行播放。
DASH协议具有较好的抗丢包能力和适应性,能够在不同的网络环境下提供良好的用户体验。
四、FLV协议FLV(Flash Video)协议是一种用于传输视频和音频的流媒体传输协议,由Adobe Flash Player支持。
FLV协议将视频和音频数据打包成FLV文件进行传输,常用于Adobe Flash Player播放器的直播功能。
然而,由于Adobe Flash Player不再被主流浏览器支持,FLV协议的使用范围受到了限制。
五、WebSocket协议WebSocket协议是一种全双工通信协议,它可以在一个TCP连接上实现双向通信。
RTMP、RTSP、HTTP视频协议详解(附:直播流地址、播放软件)⼀、RTMP、RTSP、HTTP协议这三个协议都属于互联⽹ TCP/IP 五层体系结构中应⽤层的协议。
理论上这三种都可以⽤来做视频直播或点播。
但通常来说,直播⼀般⽤ RTMP、RTSP。
⽽点播⽤ HTTP。
下⾯分别介绍下三者的特点。
1,RTMP协议(1)是流媒体协议。
(2)RTMP协议是 Adobe 的私有协议,未完全公开。
(3)RTMP协议⼀般传输的是 flv,f4v 格式流。
(4)RTMP⼀般在 TCP 1个通道上传输命令和数据。
2,RTSP协议(1)是流媒体协议。
(2)RTSP协议是共有协议,并有专门机构做维护。
.(3)RTSP协议⼀般传输的是 ts、mp4 格式的流。
(4)RTSP传输⼀般需要 2-3 个通道,命令和数据通道分离。
3,HTTP协议(1)不是是流媒体协议。
(2)HTTP协议是共有协议,并有专门机构做维护。
(3)HTTP协议没有特定的传输流。
(4)HTTP传输⼀般需要 2-3 个通道,命令和数据通道分离。
⼆、可⽤的直播流地址通常我们进⾏ RTMP/RTSP 开发时,除了可以⾃⼰搭建视频服务器来进⾏测试外。
也可以直接使⽤⼀些电视台的直播地址,省时省⼒。
下⾯是我收集汇总的⼀些视频直播地址,亲测可⽤。
1,RTMP协议直播源⾹港卫视:rtmp:///live/hks2,RTSP协议直播源珠海过澳门⼤厅摄像头监控:rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp⼤熊兔(点播):rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov3,HTTP协议直播源⾹港卫视:/live/hks/playlist.m3u8CCTV1⾼清:/hls/cctv1hd.m3u8CCTV3⾼清:/hls/cctv3hd.m3u8CCTV5⾼清:/hls/cctv5hd.m3u8CCTV5+⾼清:/hls/cctv5phd.m3u8CCTV6⾼清:/hls/cctv6hd.m3u8苹果提供的测试源(点播):/streaming/examples/bipbop_4x3/gear2/prog_index.m3u8三、播放软件推荐:VLC要播放视频直播流,或者测试⼀个直播视频地址是否可以使⽤。
网络协议知识:RTMP协议的工作原理及应用RTMP协议的工作原理及应用RTMP(Real-Time Messaging Protocol)是一种实时传输协议,主要用于音视频流的传输,如在线直播、点播等。
它由Adobe公司开发,并在2008年推出了各种开源项目,如NGINX、Wowza等,成为广泛应用的协议之一。
RTMP协议的工作原理RTMP协议的工作原理非常简单,基本上分为三个部分:建立连接、传输数据、断开连接。
建立连接在客户端请求连接时,服务器会响应一个握手消息,通过TCP三次握手建立连接。
握手过程中,客户端会发送C0和C1两个消息,分别包含了主要的连接请求信息。
服务器会发送S0和S1两个回应消息,包含了连接请求的确认以及一些额外的验证信息。
过程如下:1.客户端发送C0消息,告诉服务器它要建立一个新的RTMP连接。
2.服务器回复S0消息,告诉客户端连接已成功建立。
3.客户端发送C1消息,包含了一些验证信息,如时间戳、认证密钥等。
4.服务器回复S1消息,包含了对C1消息的确认,以及一些服务器信息(如时间戳、加密密钥等)。
5.此时,客户端已经可以开始发送数据。
传输数据在建立连接后,客户端可以开始发送音视频数据,数据传输主要分为两种方式:1.传输视频数据:客户端通过发送RtmpMessage包(RTMP数据包)来传输视频流。
RtmpMessage包由一个固定格式的消息头和消息体组成,消息头包含了流ID、时间戳等信息,消息体则包含了实际的视频数据。
2.传输控制数据:除了视频流外,RTMP协议还可以传输控制数据(如ping包、取消流数据等),这些控制信息都由特殊的RtmpMessage包组成。
断开连接当客户端不再需要连接时,它可以发送一个断开连接的消息告诉服务器。
服务器会回复一个确认消息,并关闭连接。
过程如下:1.客户端发送断开连接的RtmpMessage包,告诉服务器它不再需要连接。
2.服务器回复一个确认消息,并关闭连接。
RTMP协议协议名称:RTMP协议一、引言RTMP(Real-Time Messaging Protocol)是一种用于实时数据传输的网络协议。
该协议主要用于音视频流的传输,常被应用于流媒体服务、在线游戏、视频会议等领域。
本协议旨在规定RTMP协议的标准格式和相关规范,以确保数据传输的稳定性、安全性和互操作性。
二、协议版本RTMP协议的当前版本为1.0。
三、协议结构1. RTMP协议采用基于TCP的传输方式。
2. 数据传输通过消息的方式进行,每个消息由一个消息头和消息体组成。
3. 消息头包含了消息的类型、长度、时间戳等信息,用于协议的解析和数据的同步。
4. 消息体是实际的数据内容,可以是音频、视频或其他自定义数据。
四、连接建立1. 客户端与服务器之间的连接建立需要进行握手过程。
2. 握手过程包括客户端发送C0、C1两个握手消息,服务器返回S0、S1、S2三个握手消息。
3. 握手消息中包含了协议版本、时间戳和随机数等信息。
五、消息类型1. 协议消息:用于建立和维护连接的消息,如握手消息、连接命令等。
2. 用户消息:用于传输用户数据的消息,如音频、视频数据等。
3. 控制消息:用于控制数据传输的消息,如流控制、帧同步等。
六、消息格式1. 消息头格式:- 3字节:消息类型ID,表示消息的类型。
- 4字节:消息长度,表示消息体的长度。
- 3字节:时间戳,表示消息的时间戳。
- 1字节:时间戳扩展,表示时间戳的扩展位。
- 4字节:消息流ID,表示消息所属的流ID。
2. 消息体格式:- 消息体的具体格式由消息类型决定,可以是音频、视频或其他自定义格式。
七、连接管理1. 客户端与服务器之间可以建立多个连接。
2. 连接可以通过连接命令进行创建和销毁。
3. 每个连接都有一个唯一的连接ID,用于标识连接。
4. 连接可以通过发送消息进行数据传输。
八、数据传输1. 客户端可以通过发送用户消息将数据传输到服务器。
2. 服务器可以通过发送用户消息将数据传输到客户端。
RTMP协议1. 概述RTMP(Real-Time Messaging Protocol)是一种用于实时数据传输的协议,最早由Adobe推出。
它主要用于在Flash播放器与媒体服务器之间进行音视频传输和通信。
随着移动互联网的快速发展,RTMP协议也逐渐被应用在移动平台上,如Android和iOS设备。
2. RTMP协议的工作原理2.1 建立连接RTMP协议使用TCP作为传输层协议,默认使用1935端口进行通信。
首先,客户端与服务器之间建立一个TCP连接。
建立连接后,客户端向服务器发送一个握手请求,包含自己的一些信息,如连接方式、握手方式等。
2.2 握手过程握手过程分为两次握手:客户端握手和服务器握手。
2.2.1 客户端握手客户端握手分为两个步骤:•C0消息:向服务器发送一个字节的数据0x03,表示使用的RTMP版本号为3。
•C1消息:发送一个握手消息,包含一个时间戳和一个随机数。
时间戳用于计算网络延迟时间,随机数用于加密数据。
2.2.2 服务器握手服务器握手分为三个步骤:•S0消息:服务器向客户端回复一个字节的数据0x03,表示RTMP版本号为3。
•S1消息:发送一个握手消息,包含客户端发送的时间戳和随机数,以及服务器自己的时间戳和随机数。
•S2消息:服务器向客户端发送握手消息,包含握手过程中计算出来的密钥。
客户端根据这个密钥进行连接的验证。
2.3 数据传输握手成功后,RTMP协议使用基于分块的消息传输方法。
消息分为控制消息和数据消息两种类型。
控制消息用于控制连接状态的改变,例如设置窗口大小、设置带宽等;数据消息用于传输音视频数据。
客户端和服务器通过发送和接收RTMP消息进行通信。
消息分为消息头和消息体两部分。
消息头包含消息类型、消息体大小等信息,消息体则存放实际的数据。
3. RTMP在实时音视频传输中的应用RTMP协议广泛应用于实时音视频传输领域,例如在线直播、远程会议、视频监控等。
3.1 在线直播在在线直播中,RTMP协议被用于将主播的音视频数据传输到媒体服务器,然后再分发给观众。
RTMP ProtocolConnectNetConnect.connect()Flash Play 通过NetConnect.connect连接到RTMP Server时,首先进行握手,再发送connect的参数.1) 握手过程有三步:Step 1,Flash Player 至RTMP Server : 1个byte(0x03)+1536个byte数据.Step 2,RTMP Server至Flash Player : 1个byte(0x03)+1536个byte数据(Server的握手数据) + 1536个byte数据(通过和随机数hash得出, 详见附录)Step 3,Flash Player 至RTMP Server : 1536个byte数据(RTMP Server计算出来的). 注意:这个数据块没有1个byte的0x03.2) 接下是connect参数RTMP Server <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Flash Player 也就是Flash Playe发送的第一个RTMP(AMF)包. (channel 0x03)RTMP包格式,详见TheAMF.pdf3) RTMP Server给Flash Player的返回包(TOCHECK: 是否需要0x04的ping包)RTMP Server >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Flash Player RTMP协议步骤Step 1发送一个0x05的包,即ServerBW, (channel 0x02)(0x00 26 25 a0)Step 2发送一个0x06的包,即ClientBW, (channel 0x02)(0x00 26 25 a0) + (0x02)Step 3发送一个0x14的包,即Invoke, (channel 0x03) (body超过128的长度就要分包, 用0xc3来) string (“_result”)+ number (0x3F F0 00 00 00 00 00 00)+ Object string (“capabilities”) ; number (31.0)string (“fmsV er”) ; string (随便填) (“RubyIZUMI/0,1,2,0”)End Of Object (0x00 00 09)//(connect status)+ Object string (“code”) ; string (“NetConnection.Connect.Success”)string (“level”) ; string (“status”)string (“description”) ; string (“Connection Succeeded.”)End Of Object (0x00 00 09)RTMP Server <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Flash Player 0) 在CreateStream之前RTMP Server会收到一个0x05的ServerBW包(channel 0x02)(0x00 26 25 a0)Stream Functions1. CreateStream: NetStream(nc)RTMP Server <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Flash Player 1) RTMP Server接受到Flash Player的一个0x14的包,即Invoke (channel 0x03)string (“CreateStream”)+ number (0x40 00 00 00 00 00 00 00)+ null (0x05)RTMP Server >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Flash Player 2) RTMP Server返回Flash Player一个0x14的包,即Invoke (channel 0x03)string (“_result”)+ number (0x40 00 00 00 00 00 00 00)+ null (0x05)+ number(0x3F F0 00 00 00 00 00)RTMP Server <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Flash Player 3) RTMP Server收到FlashPlayer的一个0x04的Ping包(channel 0x02)V alue1 (0x00 03) 表示buffer time的请求V alue2 (0x00 00 00 01) 表示streamIdV alue3 (0x00 00 00 00) 表示buffer time2. Play: NetStream.play()RTMP Server <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Flash Player 1)RTMP Server收到Flash Player的一个为0x14的包,即Invoke(channel 0x08?????)Play file:NetStream.Play(“test.mp4”);string (“play”)+ number(0x00 00 00 00 00 00 00 00)+ null(0x05)+ string (“test.mp4”)Play live:NetStream.Play(“red5StreamDemo_video”);string (“play”)+ number(0x00 00 00 00 00 00 00 00)+ null(0x05)+ string (“red5StreamDemo_video”)Play file with parameters:NetStream.Play(“red5StreamDemo_video”, -1);string (“play”)+ number(0x00 00 00 00 00 00 00 00)+ null(0x05)+ string (“red5StreamDemo_video”)+ number(0xc0 6f 40 00 00 00 00 00)RTMP Server >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Flash Player 2) RTMP Server发送Flash Player一个0x01的包,即ChunkSize (channel 0x02)number (0x00 00 10 00)RTMP Server >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Flash Player 3) RTMP Server给FlashPlayer发送两个0x04的Ping包(channel 0x02)RTMP Server >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Flash Player 4) RTMP Server返回Flash Player发送一个0x14的包,即Invoke (channel 0x05, stream 0x01 00 00 00)string(“onStatus”)+ number(0x00 00 00 00 00 00 00 00)+ null(0x05)+ Object : string(“code”) ; string(“NetStream.Play.Start”)string ( “level”) ; string (“status”)string ( “description”) ; string (“-”)0x00 00 09(End Bytes)RTMP Server >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Flash Player 5) RTMP Server 给Flash Player发送一个0x09的包,即V ideoData(channel 0x05, stream 0x01 00 00 00)这个VideoData是A vcConfiguration的信息RTMP Server >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Flash Player 6)RTMP Server给Flash Player发送H.264的0x09 V ideoData包(channel 0x05, stream 0x01 00 00 00), streaming start…..3. Close: NetStream.CloseRTMP Server <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Flash Player 2)RTMP Server收到Flash Player的一个为0x14的包,即Invoke(channel 0x08?????)String(“closeStream”)+ number(0x00 00 00 00 00 00 00 00)+ null(0x05)4. Publish: NetStream.Publish在createStream之后的行为RTMP Server <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Flash Player 1) RTMP Server收到FlashPlayer的一个0x04的Ping包(channel 0x02)V alue1 (0x00 03) 表示buffer time的请求V alue2 (0x00 00 00 01) 表示streamIdV alue3 (0x00 00 00 00) 表示buffer timeRTMP Server <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Flash Player 2)RTMP Server收到FlashPlayer的一个0x14的Invoke包(channel 0x08???)String(“publish”)+ number(0x00 00 00 00 00 00 00 00)+ null(0x05)+ String(“read5StreamDemo”)+ String(“live”)RTMP Server >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Flash Player 3) RTMP Server给FlashPlayer发送一个0x14的Invoke包(channel 0x04) //注意根据ChunkSize 分ChunkString(“onStatus”)+ number(0x3f f0 00 00 00 00 00 00)+ null(0x05)+ Object: string ( “level”) ; string (“status”)string(“code”) ; string(“NetStream.Publish.Start”)string ( “description”) ; string (“”)string(“details”); string(“red5StreamDemo ”)string(“clientid”); number(0x3f f0 00 00 00 00 00 00)+ End of Object(0x00 00 09)RTMP Server <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Flash Player 3)FlashPlayer就开始向RTMP server发送AudioData包(channel 0x04) //注意AudioData的ChunkSize为64//TODORuby的握手数据生成算法:## RubyIZUMI## Copyright (C) 2008 Y aacov Akiba Slama <ya@># Copyright (C) 2008 Takuma Mori, SGRA Corporation# <mori@sgra.co.jp> <http://www.sgra.co.jp/en/>## This program is free software: you can redistribute it and/or modify# it under the terms of the GNU Affero General Public License as# published by the Free Software Foundation, either version 3 of the# License, or any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details.## Y ou should have received a copy of the GNU Affero General Public License# along with this program. If not, see </licenses/>.#HandshakeServer = [0x00,0x86,0x4f,0x7f,0x00,0x00,0x00,0x00,0x6b,0x04,0x67,0x52,0xa2,0x70,0x5b,0x51, 0xa2,0x89,0xca,0xcc,0x8e,0x70,0xf0,0x06,0x70,0x0e,0xd7,0xb3,0x73,0x7f,0x07,0xc1, 0x72,0xd6,0xcb,0x4c,0xc0,0x45,0x0f,0xf5,0x4f,0xec,0xd0,0x2f,0x46,0x2b,0x76,0x10, 0x92,0x1b,0x0e,0xb6,0xed,0x71,0x73,0x45,0xc1,0xc6,0x26,0x0c,0x69,0x59,0x7b,0xbb, 0x53,0xb9,0x10,0x4d,0xea,0xc1,0xe7,0x7b,0x70,0xde,0xdc,0xf8,0x84,0x90,0xbf,0x80, 0xe8,0x85,0xb2,0x46,0x2c,0x78,0xa1,0x85,0x01,0x8f,0x8b,0x05,0x3f,0xa1,0x0c,0x1a, 0x78,0x70,0x8c,0x8e,0x77,0x67,0xbc,0x19,0x2f,0xab,0x26,0xa1,0x7e,0x88,0xd8,0xce, 0x24,0x63,0x21,0x75,0x3a,0x5a,0x6f,0xc2,0xa1,0x2d,0x4f,0x64,0xb7,0x7b,0xf7,0xef, 0xda,0x45,0xb2,0x51,0xfd,0xcb,0x74,0x49,0xfd,0x63,0x8b,0x88,0xfb,0xde,0x5a,0x3b, 0xab,0x7f,0x75,0x25,0xbb,0x35,0x51,0x03,0x81,0x12,0xff,0x66,0x02,0x3d,0x88,0xdc, 0x66,0xa2,0xfb,0x09,0x24,0x9d,0x86,0xfd,0xc4,0x00,0xc2,0x8b,0x6f,0xb7,0xb2,0x15, 0x10,0xc0,0x1b,0x71,0xa8,0x3e,0x88,0xeb,0x7e,0xf3,0xb2,0xe3,0xe8,0x3c,0x00,0x9b, 0x26,0xba,0xb4,0x5f,0x2c,0x36,0xf3,0x4a,0x59,0x09,0x1b,0xe5,0x00,0x9d,0xe4,0x66, 0x4d,0x05,0x66,0xd0,0xd1,0xd6,0x94,0x4f,0x64,0xa1,0x2e,0x8d,0x2f,0xb0,0x06,0x01, 0xb3,0x00,0x3d,0x77,0xcd,0x1b,0xdd,0xcc,0xbf,0xe9,0xcd,0x1a,0x6b,0x68,0xdd,0x1c, 0x7b,0xfd,0x2e,0xb1,0x8b,0x45,0xfd,0x5b,0x48,0x52,0x03,0x01,0xe8,0xf1,0x0f,0xe7, 0x27,0xfc,0x2a,0x52,0x7c,0x14,0x22,0x8b,0x74,0xbd,0xd9,0x97,0x63,0xef,0xfa,0xa3, 0xd9,0x21,0x12,0x0b,0x04,0x62,0x02,0x98,0x41,0xf2,0xb4,0xc3,0xe3,0xe2,0x2b,0x2a, 0xff,0xca,0xb4,0x48,0x1e,0x82,0x50,0x90,0x94,0x37,0x24,0x7e,0xa1,0x03,0x1a,0xf0, 0x9f,0x2b,0xbe,0x64,0xe5,0x53,0xb9,0xb6,0x43,0x8e,0x26,0x6c,0x63,0x72,0x8d,0xb7, 0x7c,0xb8,0x21,0x8f,0xbb,0x1c,0x2a,0x4e,0xc7,0xec,0xa7,0xa9,0xbc,0x15,0x10,0xe9,0x4c,0x46,0xa5,0x60,0xa9,0x71,0x41,0xdd,0x25,0xf5,0xc1,0xf6,0xbd,0x75,0x1f,0xb0, 0x15,0xe0,0xed,0xc2,0x4b,0xac,0xf1,0xc8,0xef,0xa3,0x44,0xbe,0x90,0xab,0x77,0x28, 0xbf,0xc0,0xe0,0x63,0xaf,0xd9,0x07,0x9d,0x93,0x16,0x90,0x7a,0xe2,0xb4,0xe8,0xe2, 0x3e,0x4b,0x18,0x5f,0x3e,0x87,0x09,0xbe,0x36,0xd0,0x8f,0x7c,0x22,0x13,0x9f,0xc5, 0x78,0xe0,0x54,0x4c,0xa7,0x77,0x3f,0xdf,0x87,0x4a,0x28,0x7b,0x47,0x80,0x6a,0xf0, 0x50,0xcc,0xde,0x4c,0x44,0x41,0x74,0x3d,0x03,0x37,0x8b,0xbf,0x79,0x5b,0x8c,0xb0, 0x2f,0x6e,0x9c,0x98,0x29,0x22,0x49,0x2f,0xc9,0x6d,0xf1,0x08,0xc4,0x4f,0xb1,0x91, 0xb3,0xee,0x57,0xc1,0x17,0x5d,0xd0,0xe8,0x19,0xfb,0x9b,0xd6,0xa8,0x56,0x92,0x04, 0x4c,0x0e,0xe0,0x52,0x93,0x9a,0xec,0xed,0xf3,0xf7,0xef,0xd7,0x33,0xe3,0xcd,0xc7, 0x4b,0xac,0xb7,0xa9,0xa5,0x13,0x09,0x6c,0x94,0x49,0x72,0x03,0xf3,0xcf,0x15,0x31, 0xbc,0xb5,0x68,0xc2,0x49,0xe1,0x6e,0x7d,0xcb,0x4e,0xec,0xfc,0xa7,0xb7,0xed,0x1c, 0x02,0x49,0x0e,0x7f,0x25,0xeb,0xd1,0x81,0x81,0xc0,0xa7,0x49,0x32,0x16,0x11,0x31, 0x59,0x12,0x43,0xd3,0xa6,0x95,0x4a,0xc5,0xfe,0xdf,0x14,0xda,0xa6,0x5a,0xc0,0xd5, 0x6a,0xaf,0xb3,0xde,0x32,0x2a,0x13,0x03,0xd3,0x10,0x71,0x0b,0xc0,0x1e,0xcf,0xdb, 0xaa,0xcc,0xa6,0xb5,0x65,0x2e,0xc4,0x0b,0x5c,0xa7,0x1c,0x8b,0x2d,0x7f,0xc0,0x4c, 0x4a,0xa4,0x0b,0xa0,0x60,0xc4,0xcf,0xb1,0xbe,0xe4,0xe4,0x50,0xc9,0xcc,0xa0,0xe8, 0x79,0x12,0xc4,0xb4,0x70,0xf5,0x84,0x98,0x83,0xe2,0xa9,0x8f,0xba,0xff,0x88,0xa2, 0x21,0xba,0x00,0x3d,0xc4,0x57,0xe6,0x6a,0xf4,0xdc,0x01,0x1e,0xac,0x0a,0xcc,0x49, 0xaf,0x9c,0xc7,0xcd,0xc1,0x14,0x6e,0x12,0x87,0xf8,0x22,0xeb,0xdf,0x48,0xda,0x9f, 0xf2,0x8b,0xc1,0xd2,0x44,0x94,0xe4,0x3e,0xd0,0x85,0x56,0xe4,0x9a,0xfd,0xb9,0xb3, 0x35,0x38,0x1d,0x15,0x4d,0x28,0xab,0xb0,0x17,0xc0,0x5b,0x09,0x86,0x07,0xfa,0x69, 0xda,0x65,0xb8,0xd9,0x8f,0xe6,0xa1,0x83,0xab,0x07,0x98,0x3c,0x79,0xf4,0x59,0x08, 0x8f,0x83,0x77,0xbd,0xa1,0xa1,0x76,0x28,0x9c,0x0f,0xcc,0xdc,0xce,0x1f,0x16,0x02, 0x47,0x98,0x37,0x96,0x87,0xb1,0x70,0x3a,0xea,0xa4,0x65,0x77,0x98,0x12,0x27,0x23, 0x47,0xa8,0x1b,0x79,0xc0,0xec,0x53,0x32,0xe6,0xc1,0x61,0x7b,0xa0,0x98,0x9f,0xfc, 0x8d,0xe8,0x5c,0xaf,0xc6,0xbf,0x1f,0xd1,0x40,0xdc,0x28,0x81,0x34,0x68,0xb7,0xda, 0x10,0xf2,0x63,0x52,0xcb,0xe7,0x18,0x85,0xd5,0x99,0x33,0xee,0x9a,0x28,0xfa,0xdf, 0x6d,0xcb,0xc2,0xce,0x9d,0xed,0x9d,0xbd,0xfd,0xd7,0x0a,0xe4,0x89,0xd3,0x10,0x9b, 0xdb,0x6f,0xd9,0x37,0x8b,0x79,0x9c,0x94,0xc2,0x44,0x31,0x9f,0x24,0xef,0x21,0x1d, 0x5f,0xd6,0xf9,0x99,0x7b,0xef,0x59,0xe6,0xd6,0xdd,0x6a,0x74,0x82,0xb8,0xc5,0xfb, 0x1d,0xe8,0xfc,0x67,0x4f,0x4d,0xb5,0xcf,0xa9,0x52,0x94,0xc5,0xb7,0x32,0xa0,0x45, 0x0a,0x35,0x44,0x59,0x1e,0x1c,0x64,0x89,0x51,0x80,0x7b,0x1f,0x02,0x77,0x81,0xfa, 0xe9,0x26,0x4c,0x5f,0xe2,0x0d,0x05,0x55,0xee,0x71,0x71,0xfc,0x35,0x33,0x22,0x63, 0xf5,0x36,0x45,0xf6,0x2f,0xd0,0x13,0xb7,0x58,0x4f,0x35,0x19,0x59,0x0a,0xe5,0xf8, 0x8a,0x4c,0x59,0x32,0xbf,0xca,0xb0,0x06,0xc2,0x6c,0xa9,0x48,0x5b,0x4c,0x76,0x24, 0xae,0x9d,0x5b,0x7b,0x79,0x38,0x4e,0x9e,0x47,0x12,0x8a,0xc6,0xe0,0x04,0x37,0x72, 0xdd,0xaf,0x3d,0x0d,0x68,0x7e,0xd8,0x80,0x7b,0x07,0x23,0xce,0x40,0x4a,0xed,0x83, 0x55,0x56,0xfd,0xdb,0x95,0xb3,0x1c,0x33,0xf1,0x43,0xa8,0x0e,0x5e,0x67,0xd6,0x3a, 0xd0,0x89,0x5e,0x72,0x77,0x7f,0x10,0x3c,0xc4,0x7c,0x9a,0xa3,0x55,0xc5,0xd3,0x5b, 0x3a,0xae,0x12,0x0c,0x71,0x73,0xa0,0x58,0x90,0x54,0xa8,0x1c,0x31,0x20,0xdb,0xde, 0xdd,0x35,0xb1,0x09,0xa2,0xd0,0x6e,0x39,0x39,0xa5,0x0a,0x3d,0x8a,0x00,0x4b,0x95, 0x6f,0x8c,0x12,0x41,0xc6,0x46,0x10,0x5e,0x9d,0x50,0x85,0x0e,0x6b,0x81,0xa7,0x3b, 0x35,0xa6,0x38,0xf5,0xc2,0xba,0x6c,0x02,0xda,0x27,0x29,0x6e,0xe9,0x54,0x41,0xa4, 0x94,0x75,0xe8,0x55,0xc0,0xe3,0xc2,0x91,0x8a,0x1d,0xfb,0x2b,0xba,0x43,0xe7,0x45,0x85,0xe8,0x13,0x07,0x1d,0x9c,0x37,0xa8,0xf3,0xca,0xf4,0x19,0x77,0xc4,0x65,0xd6, 0x18,0x3e,0x60,0x08,0x74,0x49,0xba,0xc8,0x86,0x37,0x8a,0x0f,0x79,0x91,0x53,0x20, 0x23,0x00,0xb9,0xc5,0x1b,0x01,0xdd,0x10,0x34,0x05,0x42,0xa0,0x64,0xab,0x4d,0x51, 0xf4,0x53,0x35,0x18,0xde,0x20,0x1f,0xaa,0xe2,0x40,0x0d,0x6d,0x77,0x36,0x1f,0xee, 0x3a,0x93,0xdb,0x1d,0xd6,0xa0,0x23,0xcc,0xe6,0xa8,0x44,0x8e,0xae,0x9c,0xd7,0x97, 0x6a,0x99,0xee,0x40,0x15,0xd5,0x5a,0x6d,0xf6,0x9c,0x2c,0x52,0xcd,0xfa,0xf4,0xc8, 0x02,0xee,0xf2,0x76,0x8b,0x49,0x6d,0x66,0x83,0x5f,0xbe,0x05,0x8e,0xf2,0x27,0x73, 0xdb,0x00,0xeb,0x9a,0xb4,0xbf,0x47,0x9a,0xbd,0xf1,0x4f,0x70,0xed,0x33,0xce,0x31, 0x9d,0x9f,0x95,0x80,0x9e,0x73,0x11,0x6c,0x03,0x7b,0x6e,0x62,0x9c,0xd0,0xaa,0xf6, 0x5d,0xe0,0xd8,0x96,0x94,0x46,0xd1,0x10,0x3c,0x1b,0x9d,0x40,0xdd,0xab,0xec,0x8a, 0x5b,0x1a,0xb6,0x19,0x57,0x99,0x09,0xe8,0xec,0x82,0xdc,0x06,0x39,0x86,0x25,0x3b, 0x67,0xb5,0x17,0xc5,0x6e,0x6e,0x1c,0x6c,0xea,0xbe,0xb8,0xdd,0x68,0xf8,0xf3,0x18, 0xf2,0x3c,0x99,0xdc,0xa9,0xd3,0xb2,0x7a,0x40,0x70,0x4b,0xc2,0xd2,0xa7,0xb3,0x42, 0x19,0xff,0x0b,0xdf,0x07,0x0e,0x6b,0x8e,0xef,0x63,0x92,0xd6,0x15,0x57,0x62,0x12, 0x99,0x96,0x96,0xa5,0x34,0x5a,0x2c,0x7c,0xf6,0xbc,0x16,0xb2,0x90,0xc3,0x11,0x5e, 0xba,0x0e,0xe4,0x22,0x84,0x32,0x50,0xda,0x1e,0x37,0x06,0x5b,0xef,0x69,0xb7,0x6f, 0x10,0xcb,0xdc,0x4d,0xfd,0xdb,0xa3,0xef,0x54,0xea,0xda,0x55,0xba,0x32,0xf4,0x86, 0x6b,0xb1,0xc8,0xfc,0x12,0x9a,0xfc,0xda,0xfd,0x2a,0xc2,0x7f,0x70,0xce,0x34,0x38,0xe6,0x6a,0x7d,0x33,0xa0,0x16,0xfb,0xfd,0xa7,0xdf,0x2e,0xe3,0x5f,0x93,0x39,0xaa, 0x00,0xc7,0x38,0x2e,0x9c,0xf3,0xc4,0x12,0x46,0xcf,0x06,0xfe,0x0f,0x82,0x82,0x74, 0x00,0x71,0xf8,0x28,0x2f,0x9b,0x3f,0x9a,0x42,0x1b,0x3e,0xa6,0x0e,0x90,0xa7,0x45, 0xa6,0xcd,0x6e,0x88,0x94,0x08,0x3a,0xe5,0x56,0x36,0x77,0x68,0x2e,0x39,0xd3,0x45, 0xee,0x89,0xf0,0x71,0x42,0x2d,0xe2,0x1b,0xf5,0x11,0xf0,0xff,0x05,0x0c,0x78,0xa1,0x65,0xcf,0x3c,0x9e,0xe3,0x37,0x72,0x3a,0x32,0xcb,0x1f,0xfd,0x9d,0x4a,0x0e,0xf7, 0x0b,0x2b,0xaa,0x57,0x2c,0x27,0xb3,0xa0,0x2a,0x0f,0x85,0x16,0x6c,0xe2,0xe0,0xa1, 0x48,0x8e,0x00,0x8d,0x6d,0xc8,0x10,0xfd,0x43,0x96,0x50,0x07,0x07,0x9a,0xbf,0x50, 0x62,0x76,0x3e,0xe1,0xf7,0x70,0xc1,0xb0,0x79,0x8e,0x61,0xe3,0xfb,0x05,0x5f,0xbb, 0x2d,0x76,0x69,0x89,0xf3,0x1e,0x62,0xf6,0x27,0x3d,0x3e,0x41,0x0f,0xf5,0x0f,0xc7, 0xf3,0x0e,0x3b,0xd5,0xed,0xcf,0xef,0x58,0xfa,0x39,0xdf,0x75,0x85,0x2b,0x8b,0xaa,0x08,0x72,0x52,0xa7,0x98,0x42,0x95,0x7b,0xb7,0xe7,0x10,0xfe,0xdb,0x54,0x34,0xfb, 0x91,0x24,0x1c,0x07,0xfb,0x9c,0xce,0xd0,0x46,0xcf,0xc4,0x9d,0x09,0x49,0x24,0xec, ].pack('C*')KeyServer = [0x47,0x65,0x6e,0x75,0x69,0x6e,0x65,0x20,0x41,0x64,0x6f,0x62,0x65,0x20,0x46,0x6c, 0x61,0x73,0x68,0x20,0x4d,0x65,0x64,0x69,0x61,0x20,0x53,0x65,0x72,0x76,0x65,0x72, 0x20,0x30,0x30,0x31,0xf0,0xee,0xc2,0x4a,0x80,0x68,0xbe,0xe8,0x2e,0x00,0xd0,0xd1, 0x02,0x9e,0x7e,0x57,0x6e,0xec,0x5d,0x2d,0x29,0x80,0x6f,0xab,0x93,0xb8,0xe6,0x36, 0xcf,0xeb,0x31,0xae,].pack('C*')require 'hmac-sha2'module RTMPclass Handshakedef Handshake.get_handshake(client)client_a = client.unpack('C*')if (client_a[4] == 0)return clientelsepart = client_a[(client_a[8] + client_a[9] + client_a[10] + client_a[11]) % 728 + 12,32].pack('C*') a = HMAC::SHA256.digest(KeyServer, part)server_a = Array.new()1504.times doserver_a.push(rand(256))endserver = server_a.pack("C*")server = server + HMAC::SHA256.digest(a, server)return serverendendendendJava的握手数据生成算法:out.put(HandshakeServer);byte[] client_a = new byte[1536];byte[] part = new byte[32];int pos = 0 , num = 0;in.get(client_a);if(client_a[4] == (byte)0x00){out.put(client_a);}else{num += (client_a[8]>0)?client_a[8]:(client_a[8]+256);num += (client_a[9]>0)?client_a[9]:(client_a[9]+256);num += (client_a[10]>0)?client_a[10]:(client_a[10]+256);num += (client_a[11]>0)?client_a[11]:(client_a[11]+256);pos = num % 728 + 12;System.arraycopy(client_a, pos, part, 0, 32);Mac mac = null;try {mac = Mac.getInstance("HmacSHA256");} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}Random rnd = new Random(256);byte[] server_a = new byte[1504];for(int i = 0; i < 1504; i++ ){server_a[i] = (byte) rnd.nextInt();}byte[] digest = null;SecretKeySpec keySpec1 = new SecretKeySpec(KeyServer, "HmacSHA256");try {mac.init(keySpec1);digest = mac.doFinal(part);SecretKeySpec keySpec2 = new SecretKeySpec(digest, "HmacSHA256");mac.init(keySpec2);digest = mac.doFinal(server_a);out.put(server_a);out.put(digest);//out.put(client_a);} catch (InvalidKeyException e1) {// TODO Auto-generated catch blocke1.printStackTrace();out.putInt(0x01);out.fill((byte)0x00,Constants.HANDSHAKE_SIZE-4);out.put(in);}}。