荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: ykwch.bbs@bbs.cqupt.edu.cn (心蓝--雨下), 信区: Linux
标  题: Linux内核网络--序
发信站: 幽幽黄桷兰 (Sat Apr  5 14:57:41 2003)
转信站: SZU!news.tiaozhan.com!news.happynet.org!CQUPT


网络
目 录
网络
网络接口源码导读
网络接口源码的结构(一)
网络接口源码的结构(二)
防火墙
netfilter
ip/tables
防火墙技术分析讲义
TCP/IP协议栈阅读笔记
启动以后
协议初始化-1
协议初始化-2
协议初始化-3
协议初始化-4
bottom up
packet 函数
packet_rcv
----------------------------------------------------------------------------
----
网络
    BSD是UNIX系统中通用的网络接口,它不仅支持各种不同的网络类型,而且也是一种
内部进程之间的通信机制。两个通信进程都用一个套接口来描述通信链路的两端。套接
口可以认为是一种特殊的管道,但和管道不同的是,套接口对于可以容纳的数据的大小
没有限制。
    Linux支持多种类型的套接口,也叫做套接口寻址族,这是因为每种类型的套接口都
有自己的寻址方法。Linux支持以下的套接口类型:
        UNIX UNIX域套接口
        INET Internet地址族TCP/IP协议支持通信。
        AX25 Amateur radio X25
        IPX Novell IPX
        APPLETALK Appletalk DDP
        X25 X25
    这些类型的套接口代表各种不同的连接服务。
Linux的BSD 套接口支持下面的几种套接口类型:
    1. 流式(stream)
        提供了可靠的双向顺序数据流连接。可以保证数据传输中的完整性、正确性和
单一性。INET寻址族中TCP协议支持这种类型。
    2. 数据报(Datagram)
        这种类型的套接口也可以像流式套接口一样提供双向的数据传输,但它们不能
保证传输的数据一定能够到达目的节点。即使数据能够到达,也无法保证数据以正确的
顺序到达以及数据的单一性、正确性。UDP协议支持这种类型的套接口。
    3. 原始(Raw)
        这种类型的套接口允许进程直接存取下层的协议。
    4. 可靠递送消息(Reliable Delivered Messages)
        这种套接口和数据报套接口一样,只能保证数据的到达。
    5. 顺序数据包(Sequenced Packets)
        这种套接口和流式套接口相同,除了数据包的大小是固定的。
    6. 数据包(Packet)
        这不是标准的BSD 套接口类型,而是Linux 中的一种扩展。它允许进程直接存
取设备层的数据包。
    INET套接口层包括支持TCP/IP协议的Internet地址族。正如上面提到的,这些协议
是分层的,每一个协议都使用另一个协议的服务。Linux系统中的TCP/IP代码和数据结构
也反映了这种分层的思想。它和BSD 套接口层的接口是通过一系列与Internet地址族有
关的套接口操作来实现的,而这些套接口操作是在网络初始化的过程中由INET 套接口层
在BSD 套接口层中注册的。这些操作和其他地址族的操作一样保存在pops向量中。
    BSD 套接口层通过INET的proto_ops数据结构来调用与INET 层有关的套接口子程序
来实现有关INET层的服务。例如,当BSD 套接口创建一个发送给INET地址族的请求时将
会使用INET的套接口创建功能。BSD 套接口层将会把套接口数据结构传递给每一个操作
中的INET层。INET 套接口层在它自己的数据结构sock中而不是在BSD 套接口的数据结构
中插入有关TCP/IP的信息,但sock数据结构是和B S D套接口的数据结构有关的。它使用
BSD 套接口中的数据指针来连接sock数据结构和BSD 套接口数据结构,这意味着以后的
INET 套接口调用可以十分方便地得到sock数据结构。数据结构sock中的协议操作指针也
会在创建时设置好,并且此指针是和所需要的协议有关的。如果需要的是TCP协议,那么
数据结构sock中的协议操
    下面是Linux系统的TCP包,从netif_rx开始 [net/core/dev.c]
中断管理管理: "netif_rx"
|netif_rx
   |__skb_queue_tail
      |qlen++
      |* simple pointer insertion *
   |cpu_raise_softirq
      |softirq_active(cpu) |= (1 << NET_RX_SOFTIRQ) // set bit NET_RX_SOFTIR
Q in the BH vector
·__skb_queue_tail [include/linux/skbuff.h]
·cpu_raise_softirq [kernel/softirq.c]
中断的后半部分: "net_rx_action"
IRQ的基本处理以后,还需要另外的“底半”处理,(参考软中断)这里的是NET_RX_SO
FTIRQ完成的。
net_rx_action [net/core/dev.c]
net_dev_init [net/core/dev.c]
|net_rx_action
   |skb = __skb_dequeue (the exact opposite of __skb_queue_tail)
   |for (ptype = first_protocol; ptype < max_protocol; ptype++) // Determine

      |if (skb->protocol == ptype)                               // what is
the network protocol
         |ptype->func -> ip_rcv // according to ''struct ip_packet_type [net
/ipv4/ip_output.c]''
    **** NOW WE KNOW THAT PACKET IS IP ****
         |ip_rcv
            |NF_HOOK (ip_rcv_finish)
               |ip_route_input // search from routing table to determine fun
ction to call
                  |skb->dst->input -> ip_local_deliver // according to previ
ous routing table check, destination is local machine
                     |ip_defrag // reassembles IP fragments
                        |NF_HOOK (ip_local_deliver_finish)
                           |ipprot->handler -> tcp_v4_rcv // according to ''
tcp_protocol [include/net/protocol.c]''
     **** NOW WE KNOW THAT PACKET IS TCP ****
                           |tcp_v4_rcv
                              |sk = __tcp_v4_lookup
                              |tcp_v4_do_rcv
                                 |switch(sk->state)
     *** Packet can be sent to the task which uses relative socket ***
                                 |case TCP_ESTABLISHED:
                                    |tcp_rcv_established
                                       |__skb_queue_tail // enqueue packet t
o socket
                                       |sk->data_ready -> sock_def_readable
                                          |wake_up_interruptible
     *** Packet has still to be handshaked by 3-way TCP handshake ***
                                 |case TCP_LISTEN:
                                    |tcp_v4_hnd_req
                                       |tcp_v4_search_req
                                       |tcp_check_req
                                          |syn_recv_sock -> tcp_v4_syn_recv_
sock
                                       |__tcp_v4_lookup_established
                                 |tcp_rcv_state_process
                    *** 3-Way TCP Handshake ***
                                    |switch(sk->state)
                                    |case TCP_LISTEN: // We received SYN
                                       |conn_request -> tcp_v4_conn_request
                                          |tcp_v4_send_synack // Send SYN +
ACK
                                             |tcp_v4_synq_add // set SYN sta
te
                                    |case TCP_SYN_SENT: // we received SYN +
 ACK
                                       |tcp_rcv_synsent_state_process
                                          tcp_set_state(TCP_ESTABLISHED)
                                             |tcp_send_ack
                                                |tcp_transmit_skb
                                                   |queue_xmit -> ip_queue_x
mit
                                                      |ip_queue_xmit2
                                                         |skb->dst->output
                                    |case TCP_SYN_RECV: // We received ACK
                                       |if (ACK)
                                          |tcp_set_state(TCP_ESTABLISHED)
·net_rx_action [net/core/dev.c]
·__skb_dequeue [include/linux/skbuff.h]
·ip_rcv [net/ipv4/ip_input.c]
·NF_HOOK -> nf_hook_slow [net/core/netfilter.c]
·ip_rcv_finish [net/ipv4/ip_input.c]
·ip_route_input [net/ipv4/route.c]
·ip_local_deliver [net/ipv4/ip_input.c]
·ip_defrag [net/ipv4/ip_fragment.c]
·ip_local_deliver_finish [net/ipv4/ip_input.c]
·tcp_v4_rcv [net/ipv4/tcp_ipv4.c]
·__tcp_v4_lookup
·tcp_v4_do_rcv
·tcp_rcv_established [net/ipv4/tcp_input.c]
·__skb_queue_tail [include/linux/skbuff.h]
·sock_def_readable [net/core/sock.c]
·wake_up_interruptible [include/linux/sched.h]
·tcp_v4_hnd_req [net/ipv4/tcp_ipv4.c]
·tcp_v4_search_req
·tcp_check_req
·tcp_v4_syn_recv_sock
·__tcp_v4_lookup_established
·tcp_rcv_state_process [net/ipv4/tcp_input.c]
·tcp_v4_conn_request [net/ipv4/tcp_ipv4.c]
·tcp_v4_send_synack
·tcp_v4_synq_add
·tcp_rcv_synsent_state_process [net/ipv4/tcp_input.c]
·tcp_set_state [include/net/tcp.h]
·tcp_send_ack [net/ipv4/tcp_output.c]
--
蒹葭苍苍白露为霜所谓伊人在水一方溯洄从之道阻且长
溯游从之宛在水中央
蒹葭萋萋白露未晞所谓伊人在水之湄溯洄从之道阻且跻
溯游从之宛在水中坻
蒹葭采采白露未已所谓伊人在水之涘溯洄从之道阻且右
溯游从之宛在水中沚
※ 来源:·幽幽黄桷兰 bbs.cqupt.edu.cn·[FROM: BlueCrystal]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店