本人从事TCP的socket编程多年,趟过很多坑,对于TCP是“全双工的字节流”这几个字的含义有深刻理解。这几个字,文字虽少,但字字精辟。如果没有深刻理解,编程中可能知其然不知其所以然,难有大作为。“全双工的字节流”详解如下:

(1) 全双工:意味着,TCP的收发是可以同时进行的。亦即接收的时候可以发送,发送的时候也可以接收,两者互不冲突,可同时进行。

而OpenSSL则不同,OpenSSL是单工的,亦即收和发不能同时进行,同一时刻只能其中之一进行,也就意味着,OpenSSL的收和发之间必须要加锁互斥,两者不能同时工作。理解了这一点,就很容易明白,OpenSSL的性能必然是低下的,即使不考虑加密带来的损失,理论上也应比普通的socket性能至少低50%,这一工作原理是很重要的原因。

(2) 字节:意味着,无论物理层或链路层收到的数据是否为一个个二进制位的数据,在TCP层接收到的数据一定是一个个字节。也就是说,我们在进行socket编程时,只需要考虑接收一个个字节,而不是一个个位的数据。

(3) 流:意味着,socket的数据无头无尾,就像流水一样,如果从中间任意位置起,你无法知道一个消息包确切的开始或结束位置,除非从TCP的头开始算起。

① 也就是意味着,我们在应用层编程时,必须定义一个应用层的包头,从收到的第一个字节开始,通过该包头能确定一个包的长度,然后根据包的长度,确定一个个包的起止位置。这也就是我们看到所有的TCP的socket编程中,都需要定义一个包头,并在其中可以获得应用层包的总长度的原因。

② 同时也意味着,数据流不是一个个应用层的数据包,对于接收,可能收到的是一个完整的数据包,也可能了收到1/3个数据包,也可能收到4/5个数据包,或者一个完整的数据包,也可能收到1.5个或3.2个数据包,这是不确定的。需要自己在编程中,自己解析确定收到的是否完整的数据包,如果不足,需要继续接收;如果多余,需要分拆成多个包。

总之,编写一个基本的勉强能用socket程序其实并不难,一般程序员花一个月的时间都能写出来,但要想写出来的程序实现多条TCP连接、不出现各种异常、CPU该忙时就忙,该空闲时时就空闲、不出现各种卡顿、多条连接间不相互影响、持续稳定通信、性能高等质量要求高的程序并非易事,国内外90%的程序员根本做不到,只是很多程序员或公司管理层不自知,对此技术方面的难度没有一个明确的判断。比如,微软的MSN与腾讯的QQ就是一个很好的例子,当年的MSN采用TCP协议,而QQ采用UDP协议,最后效果上来说,采用TCP通信的MSN的通信效果和用户体验方面明显差,而采用相对简单的UDP通信的QQ的通信效果和用户体验好得多(腾讯在技术线路的选择上成功地避开了难度较高的TCP通信,也是体现了腾讯的成功绝不是偶然的),最终导致微软的MSN退出历史舞台,就连微软这样牛X的公司都上演这样的悲剧,更别说一般的公司,在TCP通信上更是难上加难。

要做一个专业的socket程序的难度还是非常高的,必须有相当多的积累才可能编出质量过硬的软件。如果大家觉得难度过大,或者时间精力不足以从头开始编码,建议使用第三方的socket封装库来实现,专业的事情留给专业的人来做,站在巨人的肩膀上,质量更有保证,比起招聘一个程序员或团队研究2至3年还不一定能出成果相比,使用第三方socket封装库质量可靠得多。比如waisock就是一个非常优秀的socket封装库,该项目在知名公司的多个大型项目中使用过,经过了反复的锤炼,稳定可靠,性能卓越,官网是http://waisock.szxunxun.com/ ,大家不妨试试。

TCP的socket编程中“全双工的字节流”含义的深刻理解相关推荐

  1. TCP与UDP在socket编程中的区别

    TCP与UDP在socket编程中的区别 一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可 ...

  2. socket编程中常见的概念问题!

    socket编程一般指的就是网络编程,常见的服务端和客户机都是必不可少的,今天小千就来给大家介绍一下socket编程中常见的概念问题. 一.常见传输协议 1.tcp协议 TCP (Transmissi ...

  3. IP地址的三种表示格式及在Socket编程中的应用

    转自:http://blog.csdn.net/hguisu/article/details/7449955 使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理.IP地址其 ...

  4. SOCKET编程中,select()函数的作用

    SOCKET编程中,select()函数的作用Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accep ...

  5. Java TCP/IP Socket 编程 笔记

    http://jimmee.iteye.com/blog/617110 http://jimmee.iteye.com/category/93740 Java TCP/IP Socket 编程 笔记( ...

  6. IP地址的三种表示格式 及 在Socket编程中的应用

    关于windows中的INADDR_ANY这个宏 头文件winsock.h中定义#define INADDR_ANY              (u_long)0x00000000 它是用于多IP机器 ...

  7. java web接收tcp_Java多线程实现TCP网络Socket编程(C/S通信)

    开篇必知必会 在前一篇<基于TCP协议网络socket编程(java实现C/S通信)>,实际存在一个问题,如果服务器端在建立连接后发送多条信息给客户端,客户端是无法全部接收的,原因在于客户 ...

  8. C语言socket编程中关于read()和write()的思考

    最近开始学习C的socket编程,教材上有一处依照我对IO函数的理解,我感觉有点问题,故而研究了一下.学的很浅,可能有错漏. 1.socket编程中read()和write()内部原理 每个socke ...

  9. 基于TCP的socket编程网络掉线重连

    基于TCP的socket编程   sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW):基于TCP的socke ...

最新文章

  1. 深入TextCNN(一)详述CNN及TextCNN原理 - 知乎 (zhihu.com)
  2. ubuntu 安装phpstorm
  3. AutoLayout ScrollView在ios7下无法滑动
  4. 无人值守的自动 dump(一)
  5. ios7中让程序使用统一的status bar风格
  6. Handler处理器 和 自定义Opener
  7. Oracle中 drop user 和 drop user cascade 的区别
  8. 【kafka】Group coordinator xx is unavailable or invalid, will attempt rediscovery
  9. java多线程知识点总结
  10. STM32芯片包下载教程
  11. 【数字信号处理】数字信号处理简介 ( 数字信号处理技术 | 傅里叶变换 )
  12. BeautifulSoup爬取豆瓣电影top250信息
  13. 基于pyagme用python做接小球游戏
  14. 2007年春节读书心得
  15. 算法精解----11、开地址哈希表
  16. 腾讯云API与国家气象局API获取实时天气
  17. Generalized Function Pointers
  18. SpringCloud系列(一)、服务注册中心Eureka基础
  19. Unity3d制作菜单栏
  20. 小猪博客(猪窝) -- 关注新鲜、有趣、不可思议的事物

热门文章

  1. Mybase:DIY自己的知识数据库
  2. 计算机没法安装打印程序,电脑安装打印机驱动安装后不能打印的解决方法
  3. Linux正确删除软连接
  4. Windows驱动开发学习记录- x86 InlineHook字节数计算(使用Hook Api lib 0.4 for C)
  5. 美团2023年春招在线前端笔试题回忆版
  6. 绿盟漏洞-平滑升级nginx
  7. 模糊式查询——通配符
  8. 居家打工年入800多万,一共五份全职工作,他还有时间打游戏
  9. 方正证券分析报告(0607)
  10. 一个简易的简易聊天程序