1、linux的网络模型
linux使用的网络模型是TCP/UP四层网络模型,主要由应用程序、传输层、网络层、网络接口层组成。与OSI七层模型不同,但是又相互对应,它们之间关系如下图:
OSI模型的应用层、表示层、会话层对应着TCP/IP模型的应用层,传输层对应传输层,网络层对应网络互连层,数据链路层和物理层对应主机到网络层(网络接口层)。linux中的网卡驱动属于7层模型中的数据链路层,属于四层模型中的最底层的网络接口层。
2、linux网络协议栈包含的网络协议
linux用到的网络协议主要有:TCP、IP、UDP、以太网协议等。这些协议之间的关系,体现在各类协议数据包之间的关系,主要是各类数据包之间的相互包含。如下图所示
TCP数据包加上IP首部之后,称为IP数据报,IP数据报加上以太网首部,以太网尾部成为以太网帧。网络上传输的所有数据都是以太网帧的形式。这部分了解的很浅,详细点的可以看下面两篇文章:
http://www.cnblogs.com/BlueTzar/articles/811160.html
http://www.2cto.com/net/201310/252965.html
3、linux的网络编程模型
linux采用统一的网络编程模型:利用Socket(套接字)抽象层进行网络编程。如果不采用统一的编程模型,那么linux的网络编程会是下图的情况:
当不同的用户进程,想要使用不同的网络协议来传输数据时,就必须调用不同协议对应的方法。比如可能进程a要调用tcp_send方法。进程b要调用ip_send方法,而进程c却要调用udp_send方法。这样,实际网络编程会变得很不方便。
当有了统一编程模型后,linux的网络编程就是下图的情况:
用户程序只需要调用socket抽象层提供的统一接口即可,无需考虑具体要使用哪个协议,这些事情内核会帮我们解决,我们只要调用socket抽象层提供的接口就行。这样,进程a、b、c都只要调用send方法就OK。这就使linux网络编程变得很方便了。socket又叫套接字编程模型。
3、TCP编程模型
TCP是一种基于连接的协议。TCP编程模型有服务器和客户机两部分,如下图:
服务器要做的事:创建套接字、绑定地址、监听端口、等待连接、发/收数据、结束连接
客户端要做的事:创建套接字、连接服务器、发/收数据、结束连接
在上述模型中,填上具体的函数之后,模型如下图:
(图片来源:http://blog.chinaunix.net/uid-9112803-id-3199813.html)
实际编程时,只要按照上述模型,在程序中完成相应的步骤就行。具体如何实现,可以看linux网络编程(二)——TCP编程,连接如下
http://blog.csdn.net/andoubi/article/details/51778988