引言

在绝大多数运行TCP/IP软件的计算机中都使用一个操作系统来管理资源,比如管理某些外部设备。操作系统提供堆并行处理的支持。即使在单处理器的计算机上,操作系统也能够通过快速的切换CPU的服务对象使用户感觉多个程序在同时执行。另外,操作系统管理着主内存,其中存放了正在执行的程序。

TCP/IP软件一般位于操作系统的内部,并且可以被在机器上运行的所有应用程序所共享。因此,虽然多个程序可以同时唤醒像TCP这样的程序代码段,但是在操作系统中,该程序代码段是唯一的。当然,每个唤醒过程必须是独立的,这样一个程序的数据传输就不会影响另一个程序。

设备驱动程序和输入、输出程序

网络接口硬件将网络上传送来的分组送入计算机内存中,并通知操作系统一个分组已经到达。通常,网络接口使用“中断”机制来完成这一任务。一个中断使CPU暂时将正常处理挂起,跳转到称为“设备驱动程序”的代码段执行。设备驱动程序将重置硬件中断以准备接收下一个分组,同时通知协议软件已有一个分组到达,并要求它马上处理。

网络的输入和中断

设备驱动程序用来与硬件IO通信,并且处理中断,每一个硬件设备都对应这一个与机器直接相连的网络。

为了适应分组到达的随机性,系统必须具有能够从任何网络接口中读取分组的能力。

  • 一些操作系统使用“中断”机制来解决这个问题。

  • 一些操作系统使用的机制是:运行单个进程在多个输入设备上阻塞,当其中某个输入设备由分组到达时,该进程立即被唤醒。

  • 一些操作系统使用的机制是:为每个接口各提供一个进程,允许该进程在于其相对应的接口上阻塞,当该接口有分组到达时,对应的进程被唤醒

向高层协议传递分组

由于输入操作发生在中断期间,此时设备驱动程序不能调用任何过程来进一步处理输入分组,它必须从中断中返回,因此中断过程并不直接调用IP。再者,由于系统使用一个独立的进程实现IP,因此设备驱动程序也不可能直接调用IP。事实上,当一个携带IP数据报的分组到达后,中断过程必须将该分组置入队列中,并调用send函数通知IP进程已经有一个数据报到达。如果此时IP进程手头没有分组可处理,则调用receive函数等待下一个数据报到达。每一个网络设备都有一个相对应的输入队列,而唯一的IP进程从所有的队列中提取数据报进行处理:

IP协议与传输协议之间的数据报传输

一旦IP进程接受了一个传入的数据报,它必须决定对将其发往何处做进一步处理。如果数据报中的内容是一个TCP报文,则必须将其交付给TCP模块。如果它携带的是用户数据报UDP,则必须将其交付给UDP模块

将传入的数据报发送给TCP

由于TCP比较复杂,因此在很多设计方案中,由一个独立的进程来处理传入的TCP报文段。由于IP和TCP作为各自独立的进程执行,因而IP和TCP必须利用进程间的通信机制来通信:IP调用psend将报文段存放在端口内,而TCP调用preceive来读取端口中的报文段。

一旦TCP接收到一个报文段,就利用TCP协议端口号来寻找该报文段所属的连接。如果报文段中含有数据,TCP就把数据添加到与该连接相关的一个缓冲区中,并给发送方返回一个确认。如果输入的报文段中含有对发送出去的数据的确认,TCP输入进程还必须与TCP定时器管理进程通信,取消超时重发事件

将传入的数据报发送给UDP

由于UDP比TCP要简单得多,UDP模块不作为独立进程存在。实际上,它是由一些常规过程组成,IP进程通过调用过程来处理传入的UDP数据报。这些过程检查UDP目的站协议端口号,根据该端口号为UDP数据报选择一个操作系统队列(端口)。IP进程把UDP数据报存放在相应的端口中,使应用程序可以从这些端口中提取数据。

向应用程序的传递操作

如上图,UDP根据协议端口号,将传入的用户数据报多路分解,将它们分别放入各自相应操作系统队列中。同时,TCP分离出传入数据流,将这些数据放在缓冲区。当一个应用程序希望接收UDP数据报或者TCP流的数据时,它必须访问UDP端口或TCP缓冲区。

由于每个应用程序作为一个独立的进程执行,它必须利用系统提供的通信原语,才能与实现协议的进程通信。

例如,一个应用程序必须调用操作系统的preceive函数,来读取UDP数据报。

对于传入的TCP数据来说,应用程序没有利用preceive函数,事实上,系统利用了信号量机制来控制对TCP缓冲区中的数据的访问。希望从传入数据流中读取数据的应用程序将对控制缓冲区的信号量调用wait,而当TCP进程要将数据放入缓冲区,它调用signal。

输出时的信息流

产生输出分组的原因由两种:

  • 某个应用程序将数据传递给一个高层协议软件,高层协议软件为此而向某个低层协议软件发送一个报文(或者数据报),最终引起网络上的数据传输
  • 操作系统中的协议软件要传送一些信息(比如,一个确认或者一个对回送请求的响应)

这两种情况下,到达低层硬件上的数据帧都必须经过某个网络接口发送出去

为了有助于将分组的传输动作从那些实现了应用程序或者协议的进程的运行中分离出来,系统为每个网络接口设立了一个独立的输出队列。如下图:

对应于输出设备的输出队列是整体设计思想的重要组成部分。有了这些队列,进程生成一个分组后,就可以将其存放在队列中等待输出,而进程继续往下执行,无须等待发送该分组。当一个分组到达底层时,如果硬件处于空闲状态(队列中没有分组存在),那么执行输出任务的进程将该分组放入队列中,同时调用一个设备驱动设备启动硬件来将这个分组发送出去,待发送出去之后就可以将被发送取出的分组从队列中删除。

因此,从IP进程的角度来看,分组传送是在后台自动进行的。只要队列中还有分组,硬件就会连续不断的传送它们。只有当IP进程将一个分组放入空队列中才需要启动硬件。

当然,输出队列的容纳是有限的,如果系统生成分组的速度比网络硬件传输分组的速度快,那么队列将会溢出。如果出现了这种情况,生成分组的队列必须做出选择:要么丢弃分组,要么被阻塞,直到硬件完成一个传送分组的任务,队列腾出新的空间为止。

从TCP经过IP到网络输出

与TCP的输入一样,TCP的输出也很复杂。输出时必须先建立连接,所传送的数据必须发昂在报文段中,在对方发来确认之前,报文段必须不断的重发。一旦某个报文段被装入一个数据报中后,就可以交付给IP,由IP来处理选路和传送。系统软件利用了两个TCP进程来处理这一复杂过程。第一个进程叫做tcpout,由它来处理大部分报文分段和数据传输细节。另一个进程是tcptimer,它管理着一个定时器,并未超时重复事件定时,当某个报文段不得不重发时,它将通知tcpout

tcpout进程利用一个端口使来自多个进程的输入同步。由于TCP是面向数据流的,因而它允许应用程序一次发送几个字节的数据,端口内的数据项与个别的分组或报文段无关。实际上,一个生成数据的进行将其数据放入输出缓冲区中,并将一个消息放入端口中,通知TCP它已在输出缓冲区中写入了一些数据。定时器管理进程在定时器超时的时候也会在端口中放入一个消息,通知TCP需要重发某个报文段。因此,我们可以认为端口是一个等待TCP处理的事件队列,每个事件都将导致一个报文段的传送或重发。另一方面,也有可能一个事件并不引起任何动作(比如数据在接受窗口关闭时到达输出缓冲区)

TCP生成一个数据报之后,就将该数据报交付给IP,由IP来传送。一般来讲,数据报目的站将是另一台计算机,IP会选取一个数据报输出时经过的网络接口,并将数据报传递给对应的网络输出进程

UDP输出处理

UDP外发数据时经历的路程比较简单,由于UDP不保证可靠的传送,因而发送方无需保留数据报的备份,也不用超时重发。只要数据报一生成就可以被发送,而且此时发送方就可以丢弃该数据报的备份

任何一个发送UDP数据报的进程都必须执行UDP过程来格式化数据,同时还要执行封装数据的过程,把生成的IP数据报传递给IP进程

总结

TCP/IP协议软件是计算机操作系统中的一部分。它使用进程这一抽象概念使得各个协议软件相互独立。每一个进程独立执行,并提供明确的并行机制,这种系统中有IP进程、TCP输入进程、TCP输出进程、TCP定时器管理进程,同时每一个应用程序还各有一个进程。

下图总结了输出过程中应用程序与网络硬件之间的信息流动过程。

  • 一个应用程序,作为一个独立进程执行,调用系统例程向TCP传输数据流,或者向UDP传输数据报。
  • 对于UDP输出:运行应用程序的进程通过系统调用执行一段UDP过程,申请一个IP数据报,填写相应的目的地址,将UDP数据报封装到IP数据报中,然后将IP数据报传递给IP进程,由IP进程发送出去
  • 对于TCP输出:运行应用程序的进程通过系统调用,将数据传入操作系统中,并保存在一个缓冲区内。然后应用进程通知TCP输出进程,有新的数据等待发送。当TCP输出进程执行时,它将数据流划分成报文段,然后,为了便于发送,它将这些报文段封装在IP数据报中。最后,TCP输出进程将IP数据报放入某一端口中,IP进程将从该端口中提取并发送这些数据报

    下图总结了输入过程中应用程序与网络硬件之间的信息流动过程。
  • 网络设备驱动程序将所有携带IP数据报的传入分组放到IP进程的队列中
  • IP进程从队列中提取这些分组,并对它们进行多路分解,将各个分组传递给适当的高层协议
  • 当IP进程发现一个携带UDP的数据报时,它将调用UDP过程,将传入数据的数据报置入适当的端口中,由应用程序读取它
  • 当IP进程发现一个携带TCP的数据报时,将传入数据报置入另一端口中,由TCP输入进程从该端口提取数据报。

注意,IP进程是设计思想的中心环节:一个IP进程同时要处理输入、输出

Unix/Linux编程:操作系统中的TCP/IP软件结构相关推荐

  1. Unix/Linux编程:多协议服务器(TCP/UDP)-----DAYTIME

    这里介绍了如果构造一个单线程服务器,使用异步IO以便在多个连接上提供表面上的并发性.本文将扩展这个概念,展示一个单线程服务器如何可以适用于多个传输协议. 多协议服务器的动机 在大多数情况下,一个给定的 ...

  2. Linux操作系统下的TCP/IP网络通信

    基于Linux操作系统下的TCP/IP网络通信研究与应用 摘要:实现了一种全集成可变带宽中频宽带低通滤波器,讨论分析了跨导放大器-电容(OTA-C)连续时间型滤波器的结构.设计和具体实现,使用外部可编 ...

  3. Unix/Linux编程:进程间通信(IPC)总结

    IPC工具分类 如上,Unix系统上IPC根据功能可以分为三类 通信:这些工具关注进程间的数据交换 同步:这些进程关注进程和线程操作之间的同步 信号:虽然信号的主要作用不为此,但是在特定场景下仍然可以 ...

  4. Linux系统下实现基于TCP/IP协议的简单Socket通信

    Linux系统下实现基于TCP/IP协议的简单Socket通信 网络套接字Socket Socket概念 主机字节序和网络字节序 Sockaddr地址结构 Socket实现客户端.服务端通信 服务端程 ...

  5. 学习Unix/Linux编程要学些什么

    最近利用空余时间看了一下<Unix/Linux编程实践教程>,原书名为:Understanding Unix/Linux Programming: A Guide to Theory an ...

  6. 《Unix/linux编程实践教程》------重定向程序的I/O

    <Unix/linux编程实践教程>书中举例命令more的用法: $more filename $command | more $more < filename 用法1直接显示fil ...

  7. (个人经历)实习生春招面试中的TCP/IP常见(安全)问题及其相应解答

    阿里云后端C/C++实习生面试,本人本科大三网络安全专业,总结了一下面试中关于TCP/IP的相关问题,整理如下,期间参考的其他博客我会列出源地址.我尽量做一些自己的理解后的整理的答案,以面试中一问一答 ...

  8. Unix/Linux编程实践教程–书评

    花了两个月的时间把这本书读完了,完成了一部分的课后习题. 总的来说,这是一本挺好的Unix\Linux编程的入门书(虽然书中的小错误一大堆),书的开始部分简要介绍了Unix系统编程,讲述了如何使用男人 ...

  9. 高性能网络编程总结及《TCP/IP Sockets编程(C语言实现) (第2版)》 代码下载(链接以及文件打包)

    http://blog.csdn.net/column/details/high-perf-network.html http://blog.csdn.net/russell_tao/article/ ...

  10. Unix/Linux编程:客户应用程序------DAYTIME、TIME、ECHO

    准备 #include <sys/types.h> #include <sys/socket.h>#include <netinet/in.h> #include ...

最新文章

  1. SAP PM项目导向维护
  2. VirtualBox 共享目录
  3. 去非数字字符串的前导零
  4. linear-gradient radical-gradient详解
  5. Scala in depth 6 Scala的类型系统 中
  6. 前端工具 git笔记
  7. poidoc转换成html乱码,JAVA 利用POI实现DOC转HTML的方法及BUG修改
  8. 前端开发面试题-JavaScript(一)
  9. notepad++ 免安装版,下载,汉化
  10. Linux网络操作系统及应用教程(项目式)项目四
  11. hill密码 java_希尔密码(Hill Cipher)的实现
  12. eoLinker API-Shop 常见热门的OCR文字识别API
  13. luogu P1338 末日的传说
  14. Go语言学习系列 -- 大道至简—GO语言最佳实践​​​​​​​
  15. 如何将计算机硬盘导出,移动硬盘坏了怎么导出数据?这几点一定要牢记!
  16. mysql中日期相减_解放双手!用这3个日期函数解决入职、工龄等天数的计算
  17. BARCODE条形码插件及ean13
  18. windows c++ 错误汇总
  19. 404未找到是什么意思_常见的web错误404你知道是什么意思吗?
  20. 汽车配件销售管理系统毕业设计

热门文章

  1. iOS 实现二维码的彩色效果
  2. 007 锁存器和触发器
  3. 水溶性CdseTe ZnS量子点
  4. 从零开始Tableau | 10.表计算-基础
  5. 【应用安全】“我的QQ被盗,请大家不要相信任何消息.......”
  6. MATLAB 插值+计算离散点曲率
  7. kubectl edit 与kubectl rollout
  8. 【第五组】交互设计文档Hunger Killer
  9. CAS:870041-75-0,DMAc-PP,热活化延迟荧光(TADF)材料
  10. java workflow 教程_建议收藏,从零开始创建一个Activiti工作流,手把手教你完成...