`
thinkry
  • 浏览: 39501 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

主程的晋升攻略(4):TCP、消息分包和协议设计

阅读更多

在《主程的晋升攻略(3):IP、DNS和CDN》中,一次网络请求经过DNS解析知道了目的IP,现在就要发出网络包,这里我们说一说TCP的相关话题。

 

TCP是一种流式协议

讲网络编程的教科书一般都会对TCP的可靠传输,api用法做详细说明,但对于TCP是一种流式协议讲解的不多,但这背后隐藏着很重要的一个知识点。先做个名词定义方便交流,这里的“消息”是指应用层的一个完整的协议包

 

流式协议的特点是什么?就像流水连续不断那样,消息之间没有边界。例如send了3条消息,分别是100字节、50字节、80字节,recv时可能收到的是230字节,就是说一次recv收到了3条消息,需要应用逻辑自己对recv到的数据进行分析,得出完整的消息。能一次recv到多个消息,也可能一次recv到一个半消息或半个消息,都是有可能的,这就是流式协议的特点。有的文章讲的粘包也是这个概念。

 

消息分包

既然TCP是一种流式协议,需要应用层自己来分析出完整的消息,那有哪些方式来确定一个完整消息呢?这个就是应用层通讯协议设计的工作了。

 

先看看最常见的HTTP协议是如何来分包的。HTTP协议是一种文本协议(非二进制协议),用\r\n\r\n来分割消息头和消息体,HTTP请求的消息头中有Content-Length来告知消息体有多大,如果没有该字段就表示无消息体,GET请求大多是这样。HTTP响应的消息头中,或者有Content-Length,或者有Transfer-Encoding: chunked告知以chunk模式分析消息体。

HTTP请求



 

HTTP响应1:Conetent-Length



 

HTTP响应2:Transfer-Encoding



 

 

HTTP用\r\n\r\n来分割消息头和消息体,这种用特定字符/字符串来分割或分包的方式,还有不少协议用到。例如FTP/SMTP/POP3都是用\n来作为一个命令结束的标志。这种消息分包的方式,需要应用层去扫描已recv到的数据,性能上还不够高效,代码不严谨的还容易被攻击。在需要自定义协议的项目中,不少选择用二进制协议,解析高效,安全性更好些。

 

最简单的二进制协议分包方式是消息的头4个字节表示消息的总长度。这种方式还需要对最大消息长度做个限制,例如64K或1024K大小,避免超大数据包对接收方缓冲区的破坏。更进一步的,可以加入简单校验方法。例如消息头1个字节固定式0x2,消息的最后1个字节固定式0x3,消息总长度放在第2~5字节。这样收到完整消息后,如果头尾不是0x2和0x3,就直接异常处理。

 

协议设计

消息分包是协议设计的一个工作,协议设计的话题还不少,这里以HTTP协议为例,简要的说说里面设计的点,自己设计的协议也可以对照着有选择的使用,原理是共通的。

 

由消息头+消息体组成:空行分割HTTP head和body,HTTP头的每一行以\r\n结尾,空行就是\r\n\r\n

消息分包:如上所述,HTTP用Content-Length和Transfer-Encodeing来分包

消息压缩: 请求中有Accept-Encoding字段, 响应中用Content-Encoding 字段表明压缩方式,一般采用gzip压缩

消息加密: https  (SSL: Secure Socket Layer)

消息ID:URL就是消息ID

响应的状态码:第一个数字定义了响应的类别。

    1xx:指示信息--表示请求已接收,继续处理

    2xx:成功--表示请求已被成功接收、理解、接受

    3xx:重定向--要完成请求必须进行更进一步的操作

    4xx:客户端错误--请求有语法错误或请求无法实现

    5xx:服务器端错误--服务器未能实现合法的请求

协议版本号: HTTP/1.1中的1.1就是HTTP 1.1版本

长连接技术:请求中Connection: keep-alive表示希望服务器保持连接,减少TCP连接的开销

字符集: Content-Type字段表明了字符集,例如: Content-Type: text/html; charset=gb2312

字符转义: URL中的参数需要做URL转义处理,例如 http://xx.com/do?name=t%2F%3F%23%3Daa表示name为t/?#=aa

 

在我们自己设计协议时,可以有选择的使用,如果消息比较大,可以采用支持压缩;如果要兼容多个版本的协议,那版本号必不可少。如果采用二进制协议,字符集和字符穿衣的用处不大。

 

  • 大小: 50.2 KB
  • 大小: 61.3 KB
  • 大小: 55 KB
0
1
分享到:
评论
2 楼 thinkry 2014-11-25  
chenqidou 写道
引用锻炼:
评论:
上段论述提到,HTTP协议是一种文本协议,那么它在网络传输的时候是以什么格式传输呢?文本能用来传输么?我的理解是其传输必然是二进制码流传输,然后通过字节码对对应的分隔符进行解码。如果是这样,必然是二进制协议来处理的。与你上段描述也必然冲突!


你可以这样来理解:协议都使用可见字符即为文本协议,如果有不可见字符就是二进制协议。这个是在应用层的角度来说的,在TCP层他们都是二进制码流。

HTTP协议在消息体里其实也是有二进制内容的,但因为它的消息头都是文本协议,而且用\r\n\r\n来分割消息头和消息体,所以认为它是文本协议。
1 楼 chenqidou 2014-11-25  
引用锻炼:
先看看最常见的HTTP协议是如何来分包的。HTTP协议是一种文本协议(非二进制协议),用\r\n\r\n来分割消息头和消息体,HTTP请求的消息头中有Content-Length来告知消息体有多大,如果没有该字段就表示无消息体,GET请求大多是这样。HTTP响应的消息头中,或者有Content-Length,或者有Transfer-Encoding: chunked告知以chunk模式分析消息体。

评论:
上段论述提到,HTTP协议是一种文本协议,那么它在网络传输的时候是以什么格式传输呢?文本能用来传输么?我的理解是其传输必然是二进制码流传输,然后通过字节码对对应的分隔符进行解码。如果是这样,必然是二进制协议来处理的。与你上段描述也必然冲突!

相关推荐

    TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议

    TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域...

    TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议.

    TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议./TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议./TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议./TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和...

    TCP-IP详解 卷3:TCP事务协议,HTTP,NNTP和UNIX域协议 完整

    1. TCP事务协议(TCP Transaction Protocol, TTP):TCP事务协议是一种在TCP之上设计的高层协议,用于提供快速、可靠的事务处理服务。TTP旨在解决TCP在处理短生命周期的事务时的效率问题,如数据库查询或电子支付。...

    TCP-IP详解卷3:TCP事务协议TCP-IP详解卷3:TCP事务协议TCP-IP详解卷3:TCP事务协议

    TCP-IP详解卷3:TCP事务协议TCP-IP详解卷3:TCP事务协议TCP-IP详解卷3:TCP事务协议TCP-IP详解卷3:TCP事务协议TCP-IP详解卷3:TCP事务协议TCP-IP详解卷3:TCP事务协议TCP-IP详解卷3:TCP事务协议TCP-IP详解卷3:TCP...

    C# TCP Socket 分包传送数据

    在IT领域,网络通信是不可或缺的一部分,而TCP(Transmission Control Protocol)作为一种面向连接的、可靠的传输协议,广泛用于客户端和服务器之间的数据交换。在C#编程中,利用.NET框架提供的Socket类,我们可以...

    TCP自定义通讯协议参考

    TCP自定义通讯协议是一种基于TCP协议的通信框架,它利用非阻塞异步通信机制,实现了客户端和服务端...总的来说,TCP自定义通讯协议设计了完整的身份验证、消息传递和连接维护机制,确保了安全、高效且可靠的网络通信。

    TCP-IP详解卷三:TCP事务协议

    《TCP/IP详解卷三:TCP事务协议》是TCP/IP协议族深入学习的重要参考资料,它主要聚焦于四个关键的网络通信协议:TCP事务协议(T/TCP)、HTTP、NNTP和UNIX域协议。以下是对这些协议的详细阐述: 1. TCP事务协议(T/...

    《TCP-IP详解卷一:协议》pdf版本

    该书深入讲解了TCP/IP协议族中关键的协议和概念,成为学习计算机网络专业人员的首选参考书籍。 在详细探讨TCP/IP协议的同时,书籍通常会涉及以下核心知识点: 1. TCP/IP协议族概述:TCP/IP协议族是一个由多个不同...

    TCP-IP详解.卷三:TCP事务协议,HTTP,NNTP和UNIX域协议

    《TCP/IP详解.卷三:TCP事务协议,HTTP,NNTP和UNIX域协议》是TCP/IP协议族的经典著作之一,由...理解并掌握这些协议的原理和应用,对于网络开发和系统管理员来说至关重要,能帮助他们更有效地设计和优化网络服务。

    TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议

    TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议

    TCP/IP详解(TCP-IP详解卷一:协议、TCP-IP详解卷二:实现、TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议)

    通过阅读这套书籍,读者不仅可以掌握TCP/IP的基础知识,还能深入了解协议的实现细节,对于网络编程和网络系统设计有着极高的参考价值。无论是网络管理员、系统工程师还是软件开发者,都能从中获益匪浅。

    wireshark实验二:TCP、ICMP协议分析实验

    本实验旨在通过Wireshark工具,捕获和分析TCP和ICMP协议的数据包,以了解TCP和ICMP协议的特性和执行过程。 一、TCP协议分析 1. TCP 属于五层协议中的传输层。 2. 在Wireshark中,可以通过捕获数据包来分析TCP协议...

    tcp/ip详解 卷三:TCP事务协议HTTPNNTP和UNIX域协议

    本资源为 tcp/ip详解 卷三:TCP事务协议HTTPNNTP和UNIX域协议 全书分为三卷: 卷一:协议 卷二:实现 卷三:TCP事务协议HTTPNNTP和UNIX域协议 资源是分章节pdf高清晰版本。 本书是网络经典书籍,值得你...

Global site tag (gtag.js) - Google Analytics