您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 终极符 >

浅谈基于TCP和UDP的协议设计

发布时间:2019-07-29 23:45 来源:未知 编辑:admin

  通信协议:就是通信时所遵守的规则,只有双方按照这个规则“说话”,对方才能理解或为之服务。

  大部分网络应用是需要分帧的。举IM为例,用户登录是一个帧,用户发送文本信息是一个帧。少部分应用可以不需要分帧,比如:echo服务器,接收到什么直接回复即可;转发服务器,同样是接收到数据直接转给目标机器;更常见的情况是一个TCP连接只发送/处理一个请求之后就直接关闭,这种也就没必要分帧了。考虑到除了学习网络编程,没人做echo server。所以只要服务端不是一次连接只处理一个请求,或者纯转发,就应该采用分帧的设计。

  注意:帧是业务处理的单元,是具体应用Care的,但这不关TCP的事情!初学者往往认为tcp这端 write一次,tcp那端就会read一次,然后惊呼“粘包”、“丢包”,其实这都是程序处理不当。在这边推荐一本书籍《TCP/IP协议详解 卷1》,挺薄的,看完可以减少很多对TCP的错误认识。实际上发送方发送一帧,接收方可能要N次才能读取完成,而且可能同时读到下帧的数据。那要怎么在接收方把一帧数据不多不少的读取出来呢?

  基于长度:就是在帧前先发送帧的长度,一般用固定长度的字节来发送此长度,比如2个字节(最大帧长不能大于65535),4个字节。(ps:我也见过使用可变长度的字节来发送此长度,比如netty中的ProtobufVarint32FrameDecoder,看代码那是相当的蛋疼,我觉得完全是折腾自己,强烈不推荐。)使用基于长度的分帧方式,接受方处理流程一般是这样:“读取固定长度的字节 - 解析出帧长 - 读取帧长字节 - 处理帧”。

  基于终结符(Delimiter):最典型的应用就是HTTP协议了,使用/r/n/r/n作为终结符。使用基于终结符的分帧方式,接收方的处理流程一般是这样:“读数据 - 在读取的数据中定位终结符 - 没找到,将数据缓存 - 继续读数据 - 定位终结符 - 找到终结符,将终结符之前的数据作为一帧进行处理”。

  使用终结符的方式务必要考虑转义问题,不然在帧的数据中出现终结符,乐子就大了。

  注意不管采用哪种方式,在开发的时候都需要考虑最大帧长的问题。不然如果对方说要发送4G长度的帧(恶意or程序错误),线G字节的缓存;或者对方一直发送数据,没有终结符。都可能造成程序内存耗尽。

  一般来说,基于长度的分帧方式。开发更简单,程序执行效率也更高,使用更广泛些。基于终结符也不是一无是处:可读性更好,容易模拟和测试(如用telnet)。下面重点讨论基于长度的分帧方式。

  一般来说,我们会将帧分为帧头(frame header,一般是固定长度)和帧体(frame body,一般是可变长度,也有固定长度的)。如上所述,最简单的帧头只要一个字段——帧长。但在实际应用中,一个典型的帧头可能还有以下字段:

  a)消息类型(message type):在一个网络应用中,往往有多种类型的帧。比如对于IM,有登陆/登出/发送消息/……。接收方需要根据帧头的消息类型字段,解码出不同种类的消息,交给相应处理模块进行处理。也就是帧的结构是Length-Type-Message,Length-Type可以视为帧头,Message是帧体。消息类型一般也是使用固定长度,比如Length 4个字节,Type 4个字节,那么帧头的长度就是8个字节。接收方处理流程:“读帧头长度字节数据 - 解码帧头获得长度和消息类型 - 读帧体长度字节数据 - 根据消息类型解码消息 - 处理消息”。Length-Type-Message结构的帧设计是使用最广泛的,普适性最好也最精简的设计。

  b)请求序列号(serials):这个不是必选项,但我觉得对于非echo式的服务(echo式的服务:总是客户端发送请求-服务端针对该请求应答,应答保证严格按照请求顺序),加上这个字段肯定不后悔。这样对于乱序(如果有消息队列后台线程池,很正常)的执行结果,才能够和请求对上号,从而做出正确的处理。一般来说,高性能的服务端要保证响应的严格有序,是比较麻烦和影响性能的。

  c)版本号(version):很多人这么用,但我觉得大部分情况下这不是个好主意。帧头应该放大部分/全部帧都需要的字段。而版本号可能只有少数包如登录会用到,所以放到登录包体里可能更合适。单独维护每个协议的版本工作量会比较大,开发起来会比较繁琐易错。至于担心解码失败,更好的方式是采用类似Protobuf这种可以向下兼容的编解码方案。

  注意:在帧头设计时应该要尽可能的精简和通用,因为帧头长度是每个帧都需要的额外开销。如果某个字段(如序列号)只有少数帧会使用到,完全可以放在帧体里去。反之,如果某个字段大部分包都有,却不定义在包头,会导致难以统一处理,增加开发工作量。这些需要根据具体业务需求来进行权衡,没有统一的答案。举个例子,Length-Type-Message结构适用于大部分情况,但如果业务要求每个帧都需要表明操作者,在帧头增加UID字段变成Length-Type-UID-Message,程序的开发会更简单。

  帧体就是字段的集合,举个例子,登录帧体包含用户名、密码这两个字段(只是举例,现实的登录包往往复杂得多)。在帧体设计上,大家往往也是八仙过海各显神通。比如基于XML、json,基于字段Pos(举登录包为例,就先写/读用户名,再写/读密码。这种方式不是太好,很难向下兼容:比如登录包需要在用户名和密码间加一个用户状态,如果服务端/客户端没有同步升级,就会斯巴达)。我甚至见过狂野得离谱的直接使用C struct的,这种脑残到爆:兼容性渣不说,类对齐(可以用pragma pack避免不一致)、byte order、机器字长都会造成麻烦。

  一般来说,UDP的服务器要比TCP简单得多。而且udp本来就是基于数据包的协议。write/read是可以一一对应的(不考虑丢包),所以不需要有长度字段/终结符。

  但是要注意:为了避免丢包率过高,udp包的长度一般不应该大于1500字节(大概,为了安全起见,我一般保证小于1K),如果数据量较大,就需要分包了,这是比TCP麻烦的地方。

  典型的UDP的协议设计就是:Type-Message。Type长度固定,用于说明消息类型;Message是消息体,和tcp的帧体设计同样即可。

  一.UDP包大小转自:在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好...博文来自:nokiaxjw的专栏

  HTTP协议是互联网的基础协议,也是网页开发的必备知识,最新版本HTTP/2更是让它成为技术热点。本文介绍HTTP协议的历史演变和设计思路。...

  中国科技论文在线一种业务无关的通用协议的设计#贾欢欢1,2,王纯1,2*基金项目:国家杰出青年科学基金(No.60525110);国家973计划项目...

  一个突发奇想    昨天一直在想http协议的问题,http协议是基于TCP/IP协议的,我一直在想,http的实体在哪里?后来我想,http不过是一个“全球范围内的承诺”,所有使用它的人都承诺按照特...

  为什么要设计一个协议呢?因为TCP协议是面向字节流的协议,面向字节流的协议是无边界的,也就是说一次发送操作并不一定就仅仅产生一个数据包,而有可能是多个,在接收端不一定一次接收就能完成所有数据的收操作。...

  前言:     本文内容的主体基于陈康贤先生的《大型分布式网站架构》,在写本文时,笔者提炼了书里的关键内容,并在一些地方加上了自己的见解,同时书中的关键代码或伪代码付诸实践。如有不足之处,欢迎指正。在...

  使用TCP协议的常见端口主要有以下几种: (1)FTP:定义了文件传输协议,使用21端口。常说某某计算机开了FTP服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP服务。(2)Telnet...

  ude是一款基于udp的可靠传输协议,专门用于在数据传输方面对实时性要求较高的应用领域。...

  一、概述TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议。TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,T...

  原文地址:一以太网的标准以太网是一种局域网。早期标准为IEEE802.3,数据链路层使用CSMA/CD,1...

  TCP协议是传输层协议,传输层要解决的问题是主机间进程之间的通信。TCP提供的是面向连接的服务,它解决的问题是保证传输中数据的有序、可靠、无丢失、不重复的问题。它是面向字节传输的,是全双工通信。一、T...

  去年和今年分别参与了两个公司的项目,这两个项目都涉及到了通信方面的程序设计,或者是以太网络通信,或者是串口通信。凡是通信就必须要有通信协议,个人认为协议的设计是个非常严肃的工作,需要理解业务需求和掌握...

  系统设计,协议先行。大部分技术人没有接触协议的设计细节,更多的是使用已有协议进行应用层的编码,例如:(1)使用http作为载体,设计get/post/cookie参数(2)使用dubbo框架,而不用去...

  当需要进行网络通讯时,要想让双方识别对方,就涉及对协议的设计。那么在具体项目中,如何设计协议呢?或者如何设计出较高效的协议?来满足项目的要求呢?     一般来说,一个基本的数据包协议需要以下部分1....

  最初驱动了Internet的设计,并且使得Internet今日如此成功的原则,RFC1958这份文档列出了这些原则,并且对他们进行了讨论。对于所有的协议设计者都必须好好的看看这份文档,也是必修课。以下...

  TCP是互联网核心协议之一,本文介绍它的基础知识。一、TCP协议的作用互联网由一整套协议构成。TCP只是其中的一层,有着自己的分工。(图片说明:TCP是以太网协议和IP协议的上层协议,也是应用层协议的...

  1、首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步)1.建立服务端ServerSocket和客户端Socket2.打开连接到Socket的输出输...

  TCP由于其协议为保证可靠性,如三次握手,导致其比较慢,不能支持交互视频,会议等实时服务。UDP虽然是一个不可靠协议,不支持丢包重传,但是UDP可以根据端口号对应用程序进行多路复用,并能利用校验和检查...

  做一个稍微复杂一点的APP都要涉及网络,网络通讯简单一点的是使用HTTP协议,HTTP协议是PULL的,我也蛮喜欢HTTP的,因为简单。对于需要大量交互的应用还是要用socket,所以基本上还是要自己...

  下面是TCP和UDP的简单程序:简单的TCP网络程序简单的UDP网络程序https:...

  TCP通讯是流协议,它不像UDP那样基于包为边界的通讯方式,TCP流式协议,举个简单例子,一端用send分别发送100,123,120字节的数据,另一端用recv可以一下子接收到100+123+120...

  TCP一般用于文件传输(FTPHTTP对数据准确性要求高,速度可以相对慢),发送或接收邮件(POPIMAPSMTP对数据准确性要求高,非紧急应用),远程登录(TELNETSSH对数据准确性有一定要求,...

  基于TCP/UDP的应用层协议有那些TCP支持的应用协议主要有:Telnet、FTP、SMTP等;UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系...

  最近因为面临毕业找工作,所以把搁置许久的计算机网络书又重新翻出来看。我一直都认为,TCP,UDP和其他的那么多P都是同级关系,或者说是谁都不碍着谁(因为这句话是不正确的,所以加了删除线)。有这种观点铁...

  对于TCP和UDP协议一般分客户端和服务端来说,在写程序的时候,也同样这样分。    Socket,可以作插口或者插槽讲。软件程序可以想象为弄一根网线,一头插在客户端,一头插在服务端,然后进行...

  基于TCP协议的网络摄像头的设计与实现一、摘要基于TCP协议的网络摄像头的设计大部分和博文“基于UDP协议的网络摄像头的设计与实现”相同,本篇博文采用的TCP协议栈为NicheStack协议栈(同...

  TCP和UDP的区别?TCP提供面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报。TCP注重数据安全性,UD...

  TCP协议设计原理最近去了解TCP协议,发现这是一个特别值得深思的协议。在本篇博客中,不会长篇大论的给大家介绍TCP协议特点、包头格式以及TCP的连接和断开等基本原理,而是会带大家深入理解为什么要...

  基于UDP协议的Socket通信    TCP和UDP最大的区别在于是否需要客户端与服务端建立连接后才能进行数据传输,UDP以数据报作为数据的传输载体,在进行传输时首先要把传输的数据定义成数据报(Da...

  参见:LinuxC编程一站式学习 下图是基于TCP协议的客户端/服务器程序的一般流程(该图出自[UNPv13e]):图 37.2. TCP协议通讯流程 建立连接的过程(该图出自[UNPv13e]):图...

  一、了解UDP协议一些具体细节(可以直接跳到二、三看协议设计部分)UDP协议的工作是将待发送的网络数据流量压缩成数据报的形式,然后由服务器端发送给客户端。但是UDP协议是面向无连接的,它只提供最大努力...

  前言UDPTCPTCP的三次握手TCP四次挥手累计确认顺序问题和丢包问题流量控制的问题拥塞控制的问题总结及面试问题前言前端的面试中经常问的TCP和UDP的区别,网上也有好多内容,比如TCP和UDP的区...

  学术论坛基于UDP的通讯协议赖步英(广州航务工程学校,广州510330)王小强(广州市华南师范大学计算机系)摘要:基于目前UDP协议的不足:无连接和通信不可靠;本人在参考TCP协议及ISO7层协议、X...

  假如我们要做一个C/S型的程序设计,服务端和客户端使用TCP通信,这时就需要在TCP协议之上,选择一个合适的应用层协议,如果不喜欢已有的协议,那就需要自己去实现一个协议规程,现在我们就要去完成一个图1...

  基于UDP协议的客户端/服务器是不可靠的,无连接的,所以相比于TCP来说,服务器端就不需要listen和accept操作,而客户端也就不需要connect操作。先来认识一下UDPsocket里的两个函...

http://womensarab.com/zhongjifu/225.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有