网络协议栈10:connect()函数之前之整体框图

 

Connect函数的执行流程,就是按照上图的顺序,一步一步的由各个协议层来封装或解封数据的而构成的,所以这些数据,都是在分配skb_buff这个结构体空间时加入的数据空间中,按照MAC/IP/TCP的先后顺序,把数据封装好,而不是按照TCP/IP/MAC的顺序来的,在connect中,系统会调用ip_send()的函数,返回MAC的数据,此时,有可能远端地址还没有知道(本地路由是否有记录),那么在数据即将发送之前,系统还会调用ARP协议,来解析地址并填充相应字段,如果ARP发送没有结果,就会调用ICMP协议还报告错误。创建完MAC首部之后,在把指针移动IP首部位置,填充IP地址,其中的IP数据,有一些在创建socket时就已经准备好,此时只需要复制过来即可,而TCP首部是connect函数最后填充的。

从传输层(TCP)下传到网络层(TP)的数据,不是能够直接调用函数就直达的,数据先要在网络层的指定队列进行排列,即数据首先被插入到等待下传到链路层(IP)的等待队列的尾部,而下传到链路层的数据时从等待队列的首部中提取的,因此,此时,如果传输层到网络层的数据大于网路层到链路层的数据,数据就会在等待队列中暂时滞留。

数据下传到链路层后,此时,会判断数据是否大于指定的最大传送数据,如果大于,则数据会被分片,然后调用分片函数来传送数据。

从链路层到网卡的数据,又被分成优先级别递减的三个队列,来区分从链路层来的数据的优先级别,一般的原则是先把优先级别最高的队列中的数据都发送完了,才会把次级别的数据发送,因此,链路层的数据也是需要按照指定的优先级进行排列的,这些排列的目的,都是为了资源的公平利用,不会出现后来先到的现象。

Connect函数会传送所有网络协议栈,直到到数据由网卡送到网路,然后睡眠等待远方传输回来的确认信号,再发送一个收到确认信号的信号给远端,从而完成了一个链路的建立,此后,这个套接字的所有数据,就可以在这个链路上进行传输了。

注意,链路的建立成功,并不是只链路是唯一不变的,而是说链路的两端是确认了,好比从你家到你家所在的城市的飞机场,可能可以乘坐好多路公共汽车,也可以打租出车,也可以做地铁,也可能做船,有时,你为了赶时间,还可能转乘多路公交车(每次转乘可能都不同),即从你家到机场的路线,可以有很多条,每次你到达机场的路线有可能都不相同,但是,你家和机场都是不变的,不管其中的过程如何变化。

posted on 2012-01-09 11:32  image eye  阅读(962)  评论(0编辑  收藏  举报