linux tcp缓冲区大小如何设置?Linux内核网络协议栈TCPIP分析之三
一 概述
网络层的任务:选择合适的网间路由和交换结点, 确保数据及时传送。数据包选取合适的路径进行传输,保证了我们的数据有能力从一台主机抵达另外一台主机。
网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息- -源站点和目的站点地址的网络地址。
其主要任务包括 :
(1)路由处理,即选择下一跳;
(2)添加 IP header;
(3)计算 IP header checksum,用于检测 IP 报文头部在传播过程中是否出错;
(4)可能的话,进行 IP 分片;
(5)处理完毕,获取下一跳的 MAC 地址,设置链路层报文头,然后转入链路层处理。
1.1 IP协议的功能:
(1)寻址和路由:根据对方的IP地址,寻找最佳路径传输信息;
(2)传递服务:① 不可靠(IP协议只是尽自己最大努力去传输数据包),可靠性由上层协议提供(TCP协议);② 无连接;(事先不建立会话);
(3)数据包的分片和重组。
二 IP数据包详解
(1)版本(Version) : 4(表示使用的 IPv4协议),对等层之间要使用同一种IP协议(IPv4协议)。
(2)头部长度( Header Length) : 首部长度占4 bit ,可表示的最大数值为15个单位(1111),一个单位一个字节,最大为60字节。
(3)服务类型:占8 bit ,(Differentiated Services Field)字段来区分服务,Delay = 1: 延迟小;Throughput = 1:吞吐量大;Reliability = 1: 质量比较高,Cost = 1: 最小代价;同一时刻只有一位是1。
(4)总长度(Total Length): 占 16 bit,最大2^16 - 1 = 65535 字节,值为首部和数据之和的长度,单位为字节,因此数据报的最大长度为65535字节(MTU最大传送单元)。
(5)标识符(identification):占16 bit,它是一个计数器,用来产生数据包的标识;IP 报文的唯一id,分片报文的id 相同,便于进行重组。
(6)标志(flag):数据包在传输的过程中,标志字段MF(More Fregment),MF = 1表示后面还有分片;MF = 0 表示最后一个分片。标明是否分片。
(7)片偏移:每个数据片不同时传输,标志着某片在原分组中的相对偏移位置,以8字节为偏移单位;注意:发送数据报过大,就要对其数据报分片处理,每一个分片都会含有一个标识(IP地址 标识),到达目的地要对其所有的分片进行重新组装;重点:偏偏移计算过程;首部分大题的内容是一样,因为都属于同一个数据报文!
(8)生存时间(TTL,Time To Live)占用 8bit ,使用“跳数“作为TTL的单位。数据报每经历一个路由器时对应的TTL值就会减 1 ;防止数据报发送在路由器中出现环路,因为数据报在传送的过程中要占用一定的带宽(TTL值为零自动丢弃)。
(9)协议(8bit)字段指出此数据报所携带上层数据使用的TCP协议还是UDP协议,以便对等层接收到数据报交给上层相应的协议(TCP或者UDP协议)进行处理。
(10)首部检验和(Header checksum):16bit,字段只校验数据报的首部,不包含数据部分;看IP数据包头部是否被破坏、被篡改和丢失等。
(11)IP源地址:占32bit,数据向外发送,发送机器本身的IP地址,也称为逻辑地址;
(12)IP目的地址:占32bit,数据具体要发送目标及其的IP地址。
三IP栈处理过程
(1)module_init():#define module_init(x) __initcall(x);module_init()函数进行模块加载,将inet_init()函数作为Linux 2.4.9内核模块注册;
(2)ip_init():将IP网络协议处理函数ip_rcv()用头插法插入IP协议链表;
(3)ip_rcv()–>ip_route_input()–>ip_route_input_mc()–>ip_route_input_slow():ip_rcv()对IP头部合法性进行严格检查,然后把具体功能交给ip_rcv_finish;ip_rcv_finish()完成路由表的查询,决定报文经过IP层处理后,是继续向上传递,还是进行转发,还是丢弃。ip_rcv_finish()调用ip_route_input()处理从网络上进来的IP包,它的结果主要有两个:即如果是本地包则传给上层协议层,如果不是则选择一个出端口再发送出去。ip_route_input_slow()当路由缓存查找没有命中,且目的地址不是组播地址时,则调用ip_route_input_slow进行路由项的查找;
(4)ip_defrag():进行碎片重组,返回重组后的skb包,或者返回NULL;从接收到的IP分片报文中,提取偏移地址frag_off和标志位mf。建立碎片处理队列,队列中每个节点(struct ipq)是一个链表,这个链表保存同一个连接的碎片,当碎片都到达之后进行数据包重组,或者在一定时间(缺省30秒)内所有碎片包不能到达而释放掉。该函数接受分片的数据包(sk_buff),并试图进行组合,当完整的包组合好时,将新的sk_buff返还,否则返回一个空指针。
(5)ip_find():根据IP头信息查找队列节点;提取IP部首中的IP源地址、目标地址、标识和协议作为哈希函数的输入,根据运算结果求出分片在Hash表的位置。
推荐
- 1猫咪养的时间长了也会长得像 但是不管怎么看都像一只米老鼠357
- 210种猫咪不舒服的行为要注意观察 宠主这些行为猫咪是真的反感176
- 3用几百万的房间养一只土狗 爸爸养出狗界中的杀马特327
- 4分开才明白对方的重要:分开后我开始学着对别人好117
- 5狗子放车里闷死了有救吗?狗子锁在车里闷死了女主人当街抱着痛哭331
- 6买活鸭更划算还是杀好的鸭更划算 可达鸭难求,买活鸭这些关于它的冷知识你一定要知道321
- 7马克杯高颜值全网最火马克杯:推荐好看又实用的马克杯215
- 8再论鸡矢藤的强大功效:每日一草,鸡矢藤102
- 9养龟中最好养也最便宜的乌龟:10块的乌龟能买来养么5点教你如何买好龟357
- 10狗狗一天喂多少食物比较合适 告诉我该给狗狗吃多少犬粮237