应用程序与TCP/IP协议栈之间的关联

应用程序与TCP/IP协议栈之间的关联


问题:

应用程序是如何通过TCP/IP协议栈将数据发送到接收端?(想一下QQ聊天信息是如何发送/接收的)

应用程序是如何通过TCP/IP协议栈收到发送端发送的数据?

答案:socket 译为插口


什么是socket:狭义的认为socket = ip地址 + 端口号

为什么要引入socket:因为IP地址只能定位到一台特定的主机,而不能定位到一台特定主机上的特定进程,而端口号就是进程的ID,所以我们通过socket就可以实现进程之间的通信。


讲通信我们必须提到TCP/IP模型:

应用层
传输层
网络层
链路层

看到这样一个模型,可能觉得非常简单,但是我认为非常不简单。我们中的许多人只是使用了这个模型的最顶层应用层的功能,比如QQ、浏览器、文件下载等。。。

从传输层以下,到链路层都属于操作系统内核。TCP/IP模型对应着一个具体的实现,那就是TCP/IP协议栈,TCP/IP协议栈自然是属于操作系统内核的,无论是WINDOWS还是LINUX操作系统,内核的一些东西充满着神秘感。


我们知道,通过TCP/IP协议栈能将数据发送到接收端,也能从TCP/IP协议栈接收发送的数据。

那么我们的应用程序要发送的数据是如何与TCP/IP协议栈相关联的呢?或者,我们用QQ发送的信息是如何通过TCP/IP协议栈发送出去的呢?

答案当然是socket,因为我们在应用层和传输层之间还有一个东东非常重要,叫做插口层


插口层:

插口概念最早出现于1983年的4.2BSD版本中,它的主要目的是提供一个统一的访问网络和进程间通信协议的接口。插口层的主要功能是将进程发送的与协议有关的请求映射到产生插口时指定的与协议有关的实现


下图说明进程中的插口接口与内核的协议实现之间的层次关系:


应用程序可以调用socket bind connect listen accept。。。等这些系统函数实现网络编程,这些函数属于进程级的socket,在内核中同样有内核级的socket实现。

进程同内核交互是通过一组定义好的函数(socket bind listen accept connect read readv recv write send select ....)来进行的,这些函数称之为系统调用。


例:socket系统调用

socket系统调用产生一个新的插口,并将插口同进程在参数domain、type、protocol中指定的协议联系起来。protocol通常指提传输层协议:TCP、UDP。


进程级的socket产生一个系统调用,会进入到操作系统内核,同时会将进程级的参数domain、type、protocol一并带到内核中,内核级的socket函数实现会根据protocol的协议选择,与传输层的协议关联起来。。


进程 插口 内核 协议栈


猜你喜欢

转载自blog.csdn.net/bing_goo/article/details/9736667