您的位置:首页 > 理论基础 > 计算机网络

基于GB28181RTPoverTCP的发送程序拾遗

2016-04-14 11:31 627 查看
前言:作为一个计算机专业的老人,一直在逛CSDN、pudn等各种相关的论坛,却很少发表东西,决定从今天开始记录一下自己的日常工作,以便温故而知新并欢迎大家指正与大家共勉。

第一篇 基于GB28181RTPoverTCP的发送程序拾遗



1、TCP send 与 recv



概念1:每个TCP socket在内核中都有发送缓冲区和接收缓冲区,接收缓冲区把数据写入内核,应用程序没有读取的话,此数据会一直缓存在相应的socket接收缓存里面。

概念2:滑动窗口:概括为TCP发送和接收双方把一整条数据链分为已发送数据、已确认数据、未确认数据、不能接受数据,而沿着数据链边滑动、边确认、边接收的概念。

概念3:对于TCP,如果应用进程一直没有读取,buffer满了之后会通知对端TCP窗口关闭,而UDP会直接丢弃。

2、RTP基于TCP的发送概念



根据国标GB28181概念,PS包经RTP打包后,在RTP包头加上两个字节的RTP分包长度即可发送;

所以大致算法思路是:检测PS包头“00 00 01 BA”,提取一个完整的PS包,以TCP_MAX_SIZE==1400字节为限,如果小于TCP_MAX_SIZE,则直接加12个字节RTP包头和2个字节长度信息的发送;如果大于TCP_MAX_SIZE,则FU_A分片发送。

如下为RTP包头结构:

/******************************************************************
RTP_FIXED_HEADER
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X|  CC   |M|     PT      |       sequence number         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           timestamp                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           synchronization source (SSRC) identifier            |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|            contributing source (CSRC) identifiers             |
|                             ....                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

******************************************************************/
typedef struct
{
/* byte 0 */
unsigned char csrc_len : 4; /* CC expect 0 */
unsigned char extension : 1;/* X  expect 1, see RTP_OP below */
unsigned char padding : 1;  /* P  expect 0 */
unsigned char version : 2;  /* V  expect 2 */
/* byte 1 */
unsigned char payload : 7; /* PT  RTP_PAYLOAD_RTSP */
unsigned char marker : 1;  /* M   expect 1 */
/* byte 2,3 */
unsigned short seq_no;   /*sequence number*/
/* byte 4-7 */
unsigned  long timestamp;
/* byte 8-11 */
unsigned long ssrc; /* stream number is used here. */
} RTP_FIXED_HEADER;/*12 bytes*/


3 网络字节与主机字节

网络字节与主机字节转换的主要函数:

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

h:host; n:net; l:unsigned long; s:unsigned short;

所谓网络字节顺序(大尾顺序)就是指一个数在内存中存储的时候“高对低,低对高”(即一个数的高位字节存放于低地址单元,低位字节存放在高地址单元中)。但是计算机的内存存储数据时有可能是大尾顺序或者小尾顺序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: