CSDN lidp [http://blog.csdn.net/perfectpdl](http://blog.csdn.net/perfectpdl)
tcp/ip协议栈属于操作系统内核层,通过提供系统调用供用户空间访问,从数据报到达最底层的网卡到最终传递给上层软件有一个过程,
当一个数据报到达时网络驱动程序把数据报放到一个队列中,同时发送一个消息给ip进程,这里ip进程是一个独立的程序,专门处理ip数据报,tcp/ip协议栈中,根据协议的功能及复杂程度,一般通过进程方式实现,而协议间的数据传递则借助于操作系统提供的进程间通讯机制,当ip进程接受了一个传入的数据报,他必须决定将其发往何处作进一步处理,如果数据报中的内容是一个报文段,则必须将其交付给TCP模块,如果他携带的是用户数据报(UDP),则必须将其交付给udp模块,以此类推。
由于TCP比较复杂,因而在许多设计方案中,有一个独立的进程来处理传入的TCP报文段,由于IP和TCP有各自独立的进程执行,因而IP和TCP必须借助进程间的通信机制来通信。
一旦tcp模块收到ip进程传送过来的报文段,就利用tcp协议端口号来寻找该报文段所属的连接,如果报文段中含有数据,TCP将把数据添加到与该连接相关的一个缓冲区中,并给发送方返回一个确认,如果输入的报文段中含有对放送出去的数据的确认,tcp输入进程还必须与tcp定时器管理进程通信,取消超时重发事件。
而处理udp数据报的进程结构与处理tcp进程采用的结构不同,由于udp比tcp要简单,udp模块不作为独立进程存在,事实上,它是由一些常规过程组成。ip进程通过调用来处理传入的udp数据报,这些过程检查udp目的站的协议端口号,根据端口号为udp数据报选择一个操作系统队列,ip进程把udp数据报放在响应的端口中,是应用程序可从这些端口中提取数据报。
TCP/UDP数据输入流程图
![](https://box.kancloud.cn/2016-05-16_57393e861aa70.gif)
TCP数据报输出过程
与输入一样,tcp的输出也是很复杂的,必须先建立连接,所传送的数据必须放到报文段中,在对方发来确认之前,报文段必须不断重发,tcp把报文交给ip,由ip来处理选路和传送,系统协议栈利用两个tcp进程来处理这一复杂过程,一个为tcpout,由他来处理报文段和数据传输细节,另一个进程是tcptimer,他管理一个定时器,为超时重发事件定时,通知tcpout进程重发。下图为tcp, udp数据输出结构图。
![](https://box.kancloud.cn/2016-05-16_57393e87af91f.gif)
总结:tcp/ip协议栈是计算机操作系统中的一部分,它使用进程这一抽象概念使各个协议软件互相独立,每一个进程独立执行,并提供明确的并行机制,这种系统中有ip进程,tcp输入进程,tcp输出进程和tcp定时器管理进程,同时每个应用程序还各有一个进程。
上层应用程序作为独立进程通过系统调用向tcp传递数据流或者想udp数据报,对于udp输出处理,运行某个应用程序的进程调用一个系统调用,执行一段udp过程,申请一个ip数据报,填写相应的目的地址,将udp数据封装在Ip数据报中,然后将ip数据报传递给ip进程,由ip进程发送出去。
对于tcp输出,运行应用程序的进程调用一个系统调用(socket,send..),将数据传入操作系统中,并保存在一个缓冲区内,应用进程随后通知tcp输出进程,有新的数据等待发送,当tcp输出进程执行时,他将数据流划分成报文段,然后将这些数据封装在ip数据报中,最后,tcp输出进程将ip数据报放入某一端口中,ip进程将从该端口中提取并发送这些数据报。