C语言 Server和服务器之间的通信协议采用包头Header+包体Body的形式,能够具体实现这个吗?
C语言Server和服务器之间的通信协议采用包头Header+包体Body的形式,能够具体实现这个吗?一般“包头Header+包体Body”不是TCP和IP自己底层包装的...
C语言
Server和服务器之间的通信协议采用包头Header+包体Body的形式,能够具体实现这个吗?一般“包头Header+包体Body ”不是TCP和IP自己底层包装的吗?能用socket实现发送这样的信息格式吗? 展开
Server和服务器之间的通信协议采用包头Header+包体Body的形式,能够具体实现这个吗?一般“包头Header+包体Body ”不是TCP和IP自己底层包装的吗?能用socket实现发送这样的信息格式吗? 展开
1个回答
展开全部
当然可以,协议是具有层次的,协议的目的就是让通信双方能明白自己正在传输的是怎样的数据格式。
TCP/IP是一种比较通用的通信协议,在windows中采用socket组件库实现,是对协议通信功能的一种封装,
如你要发送一个信息(数据如“MSG”)从A到B,那么A将“MSG”打包成“4MSG”,第一个字节“4”表示这个数据包长度为4,那么接紧接的3个字节就是数据,那么这里就是一个协议,只是这个协议很简单,属于你自己开发的协议,而TCP这些协议属于开放协议,大家都知道标准,因此只要收到一个TCP数据包,那么你就可以根据协议分析你收到的数据包的格式是什么,数据包协议中,一般在数据包的开始部分定义了固定格式的信息,如TCP包头中包含了数据长度,目的的IP地址等很多信息。
如果你收到一个数据包,你不清楚它是什么格式的,那么你怎么解析呢,根本无法解析的,当然如果人工打开这个数据包进行数据内容与已知的协议比对,也许可以猜出它是什么格式。
看数据包的传送过程,
程序A:sengPackage("MSG"){ 调用TCP协议函数sendTCPPackage("4MSG");};
sendTCPPackage(char *pkg){调用IP协议函数sendIPPackage(TCP头+“4MSG”)};
sendIPPackage(char *pkg){调用MAC协议函数sendMACPackage(IP头+“TCP头+4MSG”)};
sendMACPackage(char *pkg){调用驱动发送数据包sendPkg(MAC头+“IP头TCP头+4MSG”)};
这里仅仅是用函数调用的描述解释协议实现的原理:协议的分层在编写程序时体现的就是一个调用层次关系。
在接收方,其实就是调用相同层级的函数对收到的数据包进行解包,把去掉本层头部的数据包传给上层调用函数,
如getPackage(char *buffer){
buffer = getTCPPackageData(buffer);
return buffer +1; // 去掉开始的一个字节。这里就是我自己定义的协议解包过程。
}; //buffer是收到的数据包。
char * getTCPPackage(char *buffer){
buffer = getIPPackageData(buffer);
buffer = 去掉TCP包后的数据包; // TCP包解包过程,IP,MAC的解包一样。
return buffer;
}
如HTTP是建立在TCP协议上,那么TCP包的数据部分就包含了HTTP的协议头部以及HTTP的数据部分。也就是说协议分层中,任何上层的协议被打包后的数据包(注意其中包含有协议头)被下层协议当做一个纯数据处理,下层协议并不清楚你上层怎么组织数据的。
因此我们只要能获得任何一层的协议调用函数接口,就可以采用该层协议来传输数据,我们如果能获得MAC层的调用函数接口,那么直接打包成MAC传输也可以,只是MAC的格式中不包含TCP、IP这些信息,数据包到达路由器的时候就不知道发给哪个电脑了,除非路由器知道MAC地址是哪个电脑,并且路由器支持MAC包的转发。因此需要用什么协议,是根据需要来确定的。
采用共用协议,目的是让通信过程更加通用,使系统可以通过已知的网络进行连接。
TCP/IP是一种比较通用的通信协议,在windows中采用socket组件库实现,是对协议通信功能的一种封装,
如你要发送一个信息(数据如“MSG”)从A到B,那么A将“MSG”打包成“4MSG”,第一个字节“4”表示这个数据包长度为4,那么接紧接的3个字节就是数据,那么这里就是一个协议,只是这个协议很简单,属于你自己开发的协议,而TCP这些协议属于开放协议,大家都知道标准,因此只要收到一个TCP数据包,那么你就可以根据协议分析你收到的数据包的格式是什么,数据包协议中,一般在数据包的开始部分定义了固定格式的信息,如TCP包头中包含了数据长度,目的的IP地址等很多信息。
如果你收到一个数据包,你不清楚它是什么格式的,那么你怎么解析呢,根本无法解析的,当然如果人工打开这个数据包进行数据内容与已知的协议比对,也许可以猜出它是什么格式。
看数据包的传送过程,
程序A:sengPackage("MSG"){ 调用TCP协议函数sendTCPPackage("4MSG");};
sendTCPPackage(char *pkg){调用IP协议函数sendIPPackage(TCP头+“4MSG”)};
sendIPPackage(char *pkg){调用MAC协议函数sendMACPackage(IP头+“TCP头+4MSG”)};
sendMACPackage(char *pkg){调用驱动发送数据包sendPkg(MAC头+“IP头TCP头+4MSG”)};
这里仅仅是用函数调用的描述解释协议实现的原理:协议的分层在编写程序时体现的就是一个调用层次关系。
在接收方,其实就是调用相同层级的函数对收到的数据包进行解包,把去掉本层头部的数据包传给上层调用函数,
如getPackage(char *buffer){
buffer = getTCPPackageData(buffer);
return buffer +1; // 去掉开始的一个字节。这里就是我自己定义的协议解包过程。
}; //buffer是收到的数据包。
char * getTCPPackage(char *buffer){
buffer = getIPPackageData(buffer);
buffer = 去掉TCP包后的数据包; // TCP包解包过程,IP,MAC的解包一样。
return buffer;
}
如HTTP是建立在TCP协议上,那么TCP包的数据部分就包含了HTTP的协议头部以及HTTP的数据部分。也就是说协议分层中,任何上层的协议被打包后的数据包(注意其中包含有协议头)被下层协议当做一个纯数据处理,下层协议并不清楚你上层怎么组织数据的。
因此我们只要能获得任何一层的协议调用函数接口,就可以采用该层协议来传输数据,我们如果能获得MAC层的调用函数接口,那么直接打包成MAC传输也可以,只是MAC的格式中不包含TCP、IP这些信息,数据包到达路由器的时候就不知道发给哪个电脑了,除非路由器知道MAC地址是哪个电脑,并且路由器支持MAC包的转发。因此需要用什么协议,是根据需要来确定的。
采用共用协议,目的是让通信过程更加通用,使系统可以通过已知的网络进行连接。
更多追问追答
追问
就是我自己怎么用包头Header+包体Body这个协议?
追答
包头Header+包体Body? 是什么协议?
威孚半导体技术
2024-08-19 广告
2024-08-19 广告
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层...
点击进入详情页
本回答由威孚半导体技术提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询