Linux网络编程:基于TCP的程序开发回顾篇


面向连接的TCP程序设计

相关阅读:Linux网络编程:基于UDP的程序开发回顾篇

基于TCP的程序开发分为服务器端和客户端两部分,常见的核心步骤和流程:

Linux网络编程:基于TCP的程序开发回顾篇

其实按照上面这个流程调用系统API确实可以完全实现应用层程序的开发,一点问题没有。可随着时间的推移,你会觉得这样子的开发毫无激情。为什么TCP的开发就要按照这样的流程来呢?而且一般出的问题几乎都不在这几个系统调用上,原因何在?当我们弄清网络开发的本质,协议栈的设计原理、数据流向等这些问题的答案也就会慢慢浮出水面了。接下来这几篇博文主要是围绕网络编程展开,目的是引出后面对于Linux下TCP/IP协议栈的相关分析做铺垫。

1、  创建socket

到目前为止我们知道socket的作用其实是非常大的,它不仅能够实现不同远端主机间的数据通信,还是可以实现不同进程间的通信,以及用户空间和内核空间的通信等等。其函数原型定义如下:

int socket(int domain, int type, int protocol);

domain:大家习惯性将其翻译成“协议域”或者“地址簇”,牵扯到“协议”这个词估计很多人就又晕了。也难怪,TCP、UDP我们叫协议,IP我们也叫协议,到处都是协议。那么到底什么是协议?说白了,协议其实就是事先规定好的数据通信方式。例如我们经常说的TCP/IP协议默认情况下都指的是IPv4版本协议,现在还有IPv6,它属于另外一种协议,还有在电信网里面经常听到的X.25协议,用户空间和内核空间通信的netlink协议等等。每种协议都有其特定的应用场景。这里,我们可以通俗的将domain理解成“协议种类”。

type:直译就是“类型”的意思。因为不同种类的协议提供了不同的数据传输方式,我们常见的有面向连接的流式传输模式、无连接的数据报传输方式等。

protocol:才是我们具体的协议类型,如TCP、UDP之类的。怎么理解?我们知道在IPv4协议族里,面向连接的流式套接字一般指的都是TCP协议。在电信网中NO.7信令体系中,实现了面向连接的流式套接字的协议就有ISUP和TUP协议。为什么平时一提到面向流式的套接字大家条件反射的就想起了TCP,那是因为我们心里已经默认了前提是IPv4协议族了。一般情况下,对于某种具体的套接字类型(流式或数据报式)都只有一种对应的实现协议,当然你心里必须要知道对于某些协议族有可能有多种协议。对于我们的IPv4而言,在创建socket套接字时,当指定了地址簇、套接字类型、protocol协议字段一般都设置为0。

关于socket()函数我们再打个比方:

假如说socket()函数就是个造人的机器,我们给它输入三个指令:

OK,当我们输入:

socket(黑种人,会说话,英文) =>马丁路德;

socket(黑种人,会说话,英文) =>威尔史密斯;

因为黑人缺省情况下说的话都是英文,所以他们会说话的功能也就仅局限英文了,不会有二义性。

可我们高贵的黄种人就不一样了(JP不在此范畴),所以会说话的黄种人就多了去了。所以如果我们要造一个会说话的黄种人,必须进一步限定说话的语言才行。

socket(黄种人,会说话,中文) =>孔子;

socket(黄种人,会说话,朝鲜语) =>金正日;

通过这个例子,大家就可以好好体会一下socket()函数三个参数的作用和意义。

  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容