基于GB28181RTPoverTCP的发送程序拾遗
2016-04-14 11:31
627 查看
前言:作为一个计算机专业的老人,一直在逛CSDN、pudn等各种相关的论坛,却很少发表东西,决定从今天开始记录一下自己的日常工作,以便温故而知新并欢迎大家指正与大家共勉。
概念1:每个TCP socket在内核中都有发送缓冲区和接收缓冲区,接收缓冲区把数据写入内核,应用程序没有读取的话,此数据会一直缓存在相应的socket接收缓存里面。
概念2:滑动窗口:概括为TCP发送和接收双方把一整条数据链分为已发送数据、已确认数据、未确认数据、不能接受数据,而沿着数据链边滑动、边确认、边接收的概念。
概念3:对于TCP,如果应用进程一直没有读取,buffer满了之后会通知对端TCP窗口关闭,而UDP会直接丢弃。
根据国标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包头结构:
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;
所谓网络字节顺序(大尾顺序)就是指一个数在内存中存储的时候“高对低,低对高”(即一个数的高位字节存放于低地址单元,低位字节存放在高地址单元中)。但是计算机的内存存储数据时有可能是大尾顺序或者小尾顺序。
第一篇 基于GB28181RTPoverTCP的发送程序拾遗
1、TCP send 与 recv
概念2:滑动窗口:概括为TCP发送和接收双方把一整条数据链分为已发送数据、已确认数据、未确认数据、不能接受数据,而沿着数据链边滑动、边确认、边接收的概念。
概念3:对于TCP,如果应用进程一直没有读取,buffer满了之后会通知对端TCP窗口关闭,而UDP会直接丢弃。
2、RTP基于TCP的发送概念
所以大致算法思路是:检测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;
所谓网络字节顺序(大尾顺序)就是指一个数在内存中存储的时候“高对低,低对高”(即一个数的高位字节存放于低地址单元,低位字节存放在高地址单元中)。但是计算机的内存存储数据时有可能是大尾顺序或者小尾顺序。
相关文章推荐
- http://www.devstore.cn/code/info/87.html
- HttpResponse 内容解压
- Can not find the tag library descriptor for "http://www.springframework.org/security/tags"
- Unirest-拼装http请求发送rest接口
- http 请求类
- Show me the code之Python练习册 Q13 获取网络图片
- java web HttpClient 开发一个接口
- libevent异步IO读写操作
- 浅谈TCP(传输控制协议)的可靠性
- IOS开发之网络数据Json处理
- Atitit.获取某个服务 网络邻居列表 解决方案
- Atitit.获取某个服务 网络邻居列表 解决方案
- Atitit.获取某个服务 网络邻居列表 解决方案
- TCP/IP网络协议
- TCP/IP协议三次握手与四次握手
- js人民币大小写转换(代码来源网络)
- spring mvc 注解配置StringHttpMessageConverter不生效
- 95秀-异步http请求完整过程
- RxJava Retrofit2 网络请求,返回数据格式统一的数据报文处理方法
- 沿着人工神经网络(ANN)的大道继续前进!