Title: ?????Linux??TCP/IP???????????,??Linux ???????????? TCP/IP ??????? BSD ???????????????????????????????
1?8? ??
- ?????Linux??TCP/IP???????????,??Linux
???????????? TCP/IP ??????? BSD
???????????????????????????????
2- 8.1 ????
- 8.1.1 TCP/IP ????
- 8.1.2 TCP/IP ??????????
- 8.2 ???
- 8.2.1 ??????
- 8.2.2 ?????????????
- 8.2.3 ???????
- 8.2.4 ????????
- 8.3 ??????
- 8.3.1 ????????????
- 8.3.2 ???????????
- 8.3.3 ???????????
- 8.3.4 ?????????????
- 8.4 ????????
- 8.4.1 Linux????????
- 8.4.2 ??????
- 8.4.3 ??????
- 8.4.4 ??????
- 8.4.5 Socket???????
- 8.5 IP ?
- 8.5.1 ?? IP ???
- 8.5.2 ?? IP ???
- 8.5.3 ?????????
- 8.5.4 ??????
- 8.5.5 IP ??
- ?????
-
3- 8.1 ????
- 8.1.1 TCP/IP ????
- TCP/IP ??? Internet ?????,?????????????TCP/
IP ????????????,????????????IP(Internet
Protocol)???????TCP(Transmission Control
Protocol)????????UDP (User Datagram
Protocol)?Internet??????ICMP(Internet Control
Message Protocol)? - ??????ARP(Address Resolution
Protocol)???Linux?,?????socket???????????
4 TCP/IP ?????????????,?8.1?TCP/IP
?????????????,TCP/IP???????????,??????????????????
?????
5- ?????(Network Interface Layer)????????????????????
?????,??????????,?????????????????????????????????
????? - ???(Internet Layer)??????????(IP)?????????????????
??????IP????????????????????????????????????????
?????????????????????????? - IP?????????,?????????????????????????????
?????????????,????????????????????????Internet???
???ICMP,Internet?????IGMP???????ARP??
6- ???(Transport Layer)??????????????????????????,???
?????????????????????????????????????????????????(
Transmission Control Protocol, TCP)????????,??????
????????????(User Datagram Protocol,
UDP)?????????,???????????? - ???(Application Layer)???????????????????,???????,
??????????SNMP(Simple Network Management
Protocol)???????FTP(File Transfer
Protocol)?????????SMTP(Simple Mail Transfer
Protocol)??
7- 8.1.2 TCP/IP ??????????
-
-
- ? 8.2 ??? TCP ?????????????????TCP ?? IP
????????????,??,IP ???????? TCP ??????UDP ??? IP
??????????,??????,???? IP ??????????? IP
???????????????????,?? IP ???????????,
8- 8.1.2 TCP/IP ??????????
-
-
- ?????????????? IP ?????????????????????????????
????????,??????????????????????????,??,???????????
???????????????????,?????? TCP/IP ???????,???????
IP ??,????
9- 8.1.2 TCP/IP ??????????
-
-
- ?????????????????????,??????????????????,??
Web ????????? 80???????,IP ??????????????
10- 8.1.2 TCP/IP ??????????
-
-
- ?????????????????????,??????????????????,??
Web ????????? 80???????,IP ??????????????
11- IP ????????????????? IP ?????? 8.2 ?,IP
????????????????????????,IP ??????????????????????
??????????????????????,???????????????????????,???
6 ?????,? 00-A0-0C-13-CC-78??????????????,???????
????????????????????? IP ?????,???????????,??,????
????????????? - ??????????????????????? TCP/IP
????????????????????,???????????,??????????????,??
???????????Linux ???????,???? IP
??????????????????,Linux ??????? IP
?????????????(???)??????????????,?????????????????
??????????? -
12 ? 8.3Linux ???????
? TCP/IP ???????,Linux ??????????TCP/IP
????????,Linux???????5??? 8.3 ??? Linux ????????
13- (1) BSD socket???????BSD socket????,??socket?????
struct socket?????????????????/net/socket.c
/net/protocols.c ?? - (2) INET socket?BSD socket???????????????,????tcp
/ip,????AF_INET???socket?,???????????,?????struct
sock??? - ???????/net/ipv4/protocol.c?
/net/ipv4/af_inet.c?/net/core/sock.c ?? - (3)TCP/UDP?????????,????struct
inet_protocol?struct proto??????????????????/net/
ipv4/udp.c?/net/ipv4/datagram.c?/net/ipv4/tcp.c?/n
et/ipv4/tcp_input.c?/net/ipv4//tcp_output.c?
/net/ipv4/tcp_minisocks.c?/net/ipv4/tcp_output.c?/
net/ipv4/tcp_timer.c ?? - (4)IP?????????,????struct packet_type????????????
/net/ipv4/ip_forward.c?ip_fragment.c?ip_input.c?i
p_output.c ?? - (5)?????????????????struct net_device??,??????dev
.c?,??????/driver/net???? - ????????????,????????,??????,???????
14- 8.2 ???
- ?????(socket)????????????????I/O?????????
? ????,??socket??????socket??????socket???????? - 8.2.1 ??????
- ??????TCP/IP???????????????????????????????
?????????,????????????????????? - ?????????????,??????????????????????????
?????????????????????,????????????????? - Linux?BSD ???????????????
- 1. ??(stream)
- ??????????????????????????????????????IN
ET????TCP????????? ?PF_INET?????,SOCK_STREAM??????
??????inet_stream_ops, ?????????tcp_prot?
15- 2. ???(Datagram)
- ????????????????????????????,?????????????????
??????????????,????????????????????????????UDP????
??????????????(SOCK_DGRAM)??????????inet_dgram_ops
,?????????udp_prot? - 3. ??(Raw)
- ?????????????????????????????(SOCK_RAW)???????
???inet_dgram_ops,?????????raw_prot? - 4. ??????(Reliable Delivered Messages)
- ??????????????,??????????
- 5. ?????(Sequenced Packets)
- ?????????????,?????????????
- 6. ???(Packet)
- ??????BSD ?????,??Linux ??????????????????????
??
16- 8.2.2?????????????
- ?????Unix????? (file descriptor)
????????????? - Unix??????????I/O???,????????????????????
??????????????????????????????????????????????????
????? - ??????????????,??????????????????open()??
?????????????????????????,????????????????????????
??????????????????? - ??,???????????????????,???????,??????????
?????,?????????,??????????????????????????????????
?????????????,???????????????????
171. BSD???
?8.1 BSD????????
?? ??
release ?????
bind ??????
connect ??????(TCP)?????????(UDP)
socketpair ?????????????
accept ????????
getname ??????
ioctl ??ioctl()??
listen ????????????
shutdown ??????????????
setsockopt ?????????
getsockopt ?????????
sendmsg ?????
recvmsg ?????
mmap ????????
sendpage ??????(????sendfile())
sk ??????sock,??????????
18- ?Linux?,BSD?????????????(sockfs)?????????
?????????????????????????????????????????????,????
?,??????,?????????????????????????????????????sock
et(family,type,protocol)??????????family,???type,?
??protocol?????,Linux?????????????????????????????
????????????,???????BSD???,??????????sockfs?????in
ode?BSD?????????socket??????,??u.socket_i??????,u.
socket_I?sockfs?????inode?????????? - ???BSD??????????????
- inode ??sockfs?inode????
- File ??sockfs????????
- State ??socket?????SS_FREE(???),SS_UNCNNECTE
D(???),SS_CONNECTING(????),SS_CONNECTED(???),SS_DI
SCONNECTING(??????)? - Ops ????proto_ops????,????socket?????????????
???socket??????????????????????????????,?????????
?????????????????? - ?8.1 ???BSD?????????
19?? ??
close ?????
connect ????????????
disconnect ????
accept ??????
ioctl Ioctl
init ??INET?????
destroy ????
shutdown ????????????
setsockopt ??socket
getsockopt ??socket??
sendmsg ??
recvmsg ??
bind ??????
backlog_rcv ??????????????
hash ?INET??????hash?
unhash ????
get_port ?INET????????
2. INET???
?8.2 INET????? ???
20- INET????struct sock??????????TCP/IP???BSD?
??????INET???????sk???BSD??????????????,??INET???
??TCP/IP???????????????????INET???,????????????IP?
?,?????????,???????????????????,????????????? - INET?????????????????????proto????????,?8
.2??????? - INET?????????BSD??????????????,?????,??BS
D??????????INET??????? - sock??????80??,????????????????????????
21- 3. ????????
- ??????????,??????????
- ?? socket()??????????(sockfs)????????????????
?????????????,??????????????????????,?????????????
????????????,??????????? - (1) ??????????socket_file_ops,
??????????(proto_ops)???,?????????????????(proto)?
??? - (2) ??????socket????,??????sock?????????????i
node?u.socket_i????????????????? - (3) ???????????????????, ??????????????????,?
??????????????????
22- 8.2.3 ???????
- 1. sock_init
- ?2.2?2.4???????,init/main.c?start_kernel????kernel
_thread???init??,?init?????????do_basic_setup???,?
?????net/socket.c???sock_init??,??????TCP/IP???,??
?ipx????? - ???????,sock_init???????????
- for (i 0 i lt NPROTO i)net_familiesi
NULLsk_init()proto_init() - ??net_families?include/linux/net.h????
- struct net_proto_familyint familyint
(create)(struct socket sock, int protocol)
// These are counters for the number of different
methods of each we supportshort
authenticationshort encryptionshort
encrypt_net - ??????????,?create?callback???????,??AF_INET??????
???TCP/ICMP??????
23- sk_init???net/core/sock.c??
- struct sock sk_alloc(int family, int priority,
int zero_it)struct sock sk
kmem_cache_alloc(sk_cachep, priority)if(sk)
if (zero_it)memset(sk, 0, sizeof(struct
sock))sk-gtfamily familyreturn sk - proto_init?????????
- void _init proto_init(void)extern struct
net_proto protocolsstruct net_proto propro
protocolswhile (pro-gtname !
NULL)(pro-gtinit_func)(pro)pro - struct net_proto?include/linux/net.h?
- struct net_protoconst char name // Protocol
namevoid (init_func)(struct net_proto ) //
Bootstrap - ?protocols???net/protocols.c???,??????????????,???
????AF_INET?AF_PACKET?????????inet_proto_init?pack
et_proto_init ?
24- 2. IPv4???PACKET??????
- ????IPv4???PACKET????????????PACKET??????????,????
??????,??PACKET??,?net/packet/af_packet.c????packe
t_proto_init???? - void _init packet_proto_init(struct net_proto
pro)sock_register(packet_family_ops)registe
r_netdevice_notifier(packet_netdev_notifier) - ???sock_register?????,?????net/socket.c????net_fam
ilies??????? - int sock_register(struct net_proto_family
ops)if (ops-gtfamily gt NPROTO)
printk(KERN_CRIT "protocol d gt
NPROTO(d)\n",ops-gtfamily, NPROTO)return
-ENOBUFSnet_familiesops-gtfamilyopsreturn
0
25- ??packet_netdev_notifier??structnotifier_block,???
??include/linux/notifier.h????? - struct notifier_blockint (notifier_call)(struc
t notifier_block self, unsigned long, void
)struct notifier_block nextint priority
- register_netdevice_notifier????net/core/dev.c?,??
- int register_netdevice_notifier(struct
notifier_block nb)return notifier_chain_regist
er(netdev_chain, nb) - notifier_chain_register???include/linux/notifier.h
?? - extern _inline_ int notifier_chain_register(struc
t notifier_block list, struct notifier_block
n)while(list)if(n-gtpriority gt
(list)-gtpriority)breaklist
((list)-gtnext)n-gtnext listlistnretu
rn 0
26- ????block????,??block?????block??????notifier
_chain_register???,?????????netdev_chain??????????
?interface???????????????????ioctl???,????????????
?????????????register_netdevice_notifier?????netde
v_notifier????,??????????notifier_call?????interfa
ce?????? - inet_proto_init????net/ipv4/af_inet.c?,?????
ifdef??????????????????CONFIG_NET_IPIP?CONFIG_NET
_IPGRE?CONFIG_IP_FIREWALL?CONFIG_IP_MASQUERADE?CON
FIG_IP_MROUTE ,???CONFIG_INET_RARP?CONFIG_PROC_FS?
??????,?????????
27- (void) sock_register(inet_family_ops)for(p
inet_protocol_base p ! NULL) struct
inet_protocol tmp(struct inet_protocol
)p-gtnextinet_add_protocol(p)printk("ss",p-gt
name,tmp?", ""\n")p tmp - arp_init()ip_init()tcp_v4_init(inet_family_op
s)tcp_init()icmp_init(inet_family_ops) - rarp_ioctl_hook rarp_ioctlproc_net_register(p
roc_net_rarp)proc_net_register(proc_net_raw)p
roc_net_register(proc_net_snmp)proc_net_registe
r(proc_net_netstat)proc_net_register(proc_net_
sockstat)proc_net_register(proc_net_tcp)proc_
net_register(proc_net_udp)
28- 3. struct inet_protocol?inet_add_protocol??
- struct inet_protocol??????include/net/protocol.h??
? - struct inet_protocolint (handler)(struct
sk_buff skb, unsigned short len)void
(err_handler)(struct sk_buff skb, unsigned char
dp, int len)struct inet_protocol
nextunsigned char protocolunsigned char
copy1void dataconst char name - ??????????callback?????,??????????,???copy???????,
data????????????
29- inet_add_protocol???net/ipv4/protocol.c?
- void inet_add_protocol(struct inet_protocol
prot)unsigned char hashstruct inet_protocol
p2 - hash prot-gtprotocol (MAX_INET_PROTOS -
1)prot -gtnext inet_protoshashinet_protosh
ash protprot-gtcopy 0 - p2 (struct inet_protocol ) prot-gtnextwhile(p2
! NULL)if (p2-gtprotocol
prot-gtprotocol)prot-gtcopy 1breakp2
(struct inet_protocol ) p2-gtnext - ?????????????hash?,??hash?????????,????hash???????
??????????
30- ??????CONFIG_SYSCTL ,?arp_init????net/ipv4/arp.c?
- neigh_table_init(arp_tbl)dev_add_pack(arp_pack
et_type)proc_net_register(proc_net_arp) - ??????dev_add_pack???
- neigh_table_init???net/core/neighbour.c??
- void neigh_table_init(struct neigh_table
tbl)unsigned long now jiffies - tbl-gtparms.reachable_time neigh_rand_reach_time(
tbl-gtparms.base_reachable_time) - init_timer(tbl-gtgc_timer)tbl-gtgc_timer.data
(unsigned long)tbltbl-gtgc_timer.function
neigh_periodic_timertbl-gtgc_timer.expires now
tbl-gtgc_interval tbl-gtparms.reachable_timead
d_timer(tbl-gtgc_timer) - init_timer(tbl-gtproxy_timer)tbl-gtproxy_timer.da
ta (unsigned long)tbltbl-gtproxy_timer.function
neigh_proxy_processskb_queue_head_init(tbl-gt
proxy_queue) - tbl-gtlast_flush nowtbl-gtlast_rand now
tbl-gtparms.reachable_time20tbl-gtnext
neigh_tablesneigh_tables tbl - jiffies????????,?i386?????jiffies??50ms,????????ti
mer,??????????timerlist???gc_timer???????????(garb
age collect timer)???????arp?cache????,??????expir
es??,????????????arp???proxy_timer??????????timer?
function??????????,data????????????????
31- ???dev_add_pack??,??net/core/dev.c??
- void dev_add_pack(struct packet_type pt)int
hashifdef CONFIG_NET_FASTROUTE// Hack to
detect packet socketif (pt-gtdata)
netdev_fastroute_obstaclesdev_clear_fastrout
e(pt-gtdev)endifif(pt-gttypehtons(ETH_P_ALL)
)netdev_nitpt-gtnextptype_allptype_allpt
elsehashntohs(pt-gttype)15pt-gtnext
ptype_basehashptype_basehash pt - ????????,???ptype_all,?????????????,?????hash????
???,???????????
32- struct packet_type????include/linux/netdevice.h?,?
??????,?????????? - unsigned short type // This is really
htons(ether_type)?struct device dev //
NULL is wildcarded hereint (func) (struct
sk_buff ,struct device , struct packet_type
)void data // Private to the packet
typestruct packet_type next - ???func??????arp_packet_type??
- static struct packet_type arp_packet_type
_constant_htons(ETH_P_ARP),NULL, // All
devicesarp_rcv,NULL,NULL
33- arp_init????????proc_net_register??,?????include/l
inux/proc_fs.h? - static inline int proc_net_register(struct
proc_dir_entry x)return proc_register(proc_ne
t, x) - proc_register?fs/proc/root.c???,???????proc_net???
??????????????,??TCP??/proc???????????,????????/pr
oc/net?????????????????????
34- 4. ip_init??
- ip_init????net/ipv4/ip_output.c?
(?????????CONFIG_PROC_FS,CONFIG_IP_MULTICAST?CONFI
G_NET_CLS_ROUTE) - _initfunc(void ip_init(void))dev_add_pack(ip_p
acket_type)ip_rt_init()proc_net_register(proc
_net_igmp)
35- ip_rt_init????net/ipv4/route.c?????,????????
- _initfunc(void ip_rt_init(void))struct
proc_dir_entry entdevinet_init()ip_fib_init()
rt_periodic_timer.function rt_check_expire//
All the timers, started at system startup
tendto synchronize?Perturb it a
bit.rt_periodic_timer.expires jiffies
net_random()ip_rt_gc_interval
ip_rt_gc_intervaladd_timer(rt_periodic_timer)
- proc_net_register((struct proc_dir_entry)
PROC_NET_RTCACHE, 8, "rt_cache",S_IFREG
S_IRUGO, 1, 0, 0,0, proc_net_inode_operations,r
t_cache_get_info)ent create_proc_entry("net/
rt_acct", 0, 0)ent-gtread_proc
ip_rt_acct_read - ????????????notifier???????????,???/proc??????????
????proc_net_register????????,?create_proc_entry??
?/proc/net????????rt_acct,????????(account)???ip_r
t_acct_read????,????????????ip_rt_acct????????????
?
36- devinet_init???net/ipv4/devinet.c?????,?????
- register_gifconf(PF_INET, inet_gifconf)register_
netdevice_notifier(ip_netdev_notifier) - register_netdevice_notifier????PACKET??????????,re
gister_gifconf?????????SIOCGIFCONF????????????????
???PF_INET??,??????inet_gifconf??? - ????net/ipv4/devinet.c??inet_gifconf??,????????int
erface???????,?????name?address????
37- register_gifconf????net/core/dev.c?,??
- static gifconf_func_t gifconf_list NPROTO
- int register_gifconf(unsigned int family,
gifconf_func_t gifconf)if (familygtNPROTO)re
turn -EINVALgifconf_listfamily
gifconfreturn 0 - dev_ioctl?????????interface?I/O???gifconf_list????
?dev_ifconf??????,?dev_ifconf???dev_ioctl???????in
terface?ioctl??????????????????gifconf????gifconf?
?generous interface configure,???????????
38- ip_fib_init????net/ipv4/fib_frontend.c?,??
- _initfunc(void ip_fib_init(void))proc_net_regis
ter((struct proc_dir_entry) PROC_NET_ROUTE, 5,
"route",S_IFREG S_IRUGO, 1, 0, 0,0,
proc_net_inode_operations,fib_get_procinfo) - fib_rules_init()register_netdevice_notifier(fib
_netdev_notifier)register_inetaddr_notifier(fib
_inetaddr_notifier) - register_inetaddr_notifier??????register_netdevice
_notifier??,????notifier_chain_register??????????,
???????interface?????????????net/ipv4/fib_rules.c?
?fib_rules_init????????register_netdevice_notifier
????fib_rules_notifier?????? - fib??IPv4 Forwarding Information
Base,?IPv4??????
39- 5. tcp_v4_init???
- ????net/ipv4/tcp_ipv4.c??tcp_v4_init??
- _initfunc(void tcp_v4_init(struct
net_proto_family ops))int err - tcp_inode.i_mode S_IFSOCKtcp_inode.i_sock
1tcp_inode.i_uid 0tcp_inode.i_gid 0 - tcp_socket-gtinode tcp_inodetcp_socket-gtstate
SS_UNCONNECTEDtcp_socket-gttypeSOCK_RAW - if ((errops-gtcreate(tcp_socket,
IPPROTO_TCP))lt0)panic("Failed to create the TCP
control socket.\n")tcp_socket-gtsk-gtallocationGF
P_ATOMICtcp_socket-gtsk-gtnum
256tcp_socket-gtsk-gtip_ttl MAXTTL - tcp_inode????inode??,?tcp_socket??tcp_inode.u.sock
et_I,??????????????????
40- tcp_socket??????,?????TCP???socket?????socke
t,?TCP???????socket?,?socket????socket????????????
????SYN???RST,???????????SYN(???accept????socket)
? - ??AF_INET??,ops-gtcreate?????net/ipv4/af_inet
.c?inet_create??,??????????socket????????,????????
? - ???socket?????,??????????????net/ipv4/tcp.c?
??tcp_init????????????hash??bucket????????????????
- tcp_openreq_cacheptcp_bucket_cacheptcp_timewait_
cacheptcp_ehashtcp_bhash - ??ehash??established hash, bhash??bind
hash,????????????TCP_ESTABLISHED lt sk-gtstate lt
TCP_CLOSE???SOCK??????????????????
41- ??net/ipv4/icmp.c??icmp_init????ICMP?????????
??,????ICMP,???tcp_v4_init???IPPROTO_TCP???IPPROTO
_ICMP?proc_net_register????????? - ??,?Linux IP?????????????????,??????????
- (1)dev_add_pack
- ??????????????,????????????????????????,????
??????copy?????ETH_P_ALL???????????????????ptype_a
ll???ptype_base hash???? - (2)inet_add_protocol
- ???????IP??????,??TCP?UDP??
- (3)proc_net_register(?????proc_register)
- ?/proc/net???????????????????????????????
42- 8.2.4 ????????
- ????????????????,????????????A,????????B,??A
??????????B??????,?"Hello",?B?????? - ??TCP????????,??????,?????UDP?????
43- 1. ?????
- ???????,????????(socket),???????????????
- ...
- int sockfd
- sockfdsocket(AF_INET,SOCK_DGRAM,0)
- ...
- ???????,?????0x80????????,???????????Socket?
????????,???????????????,?sys_socketcall??????,???
?????????sys_socket?socket_bind????
44- sys_socket??sock_create????struct
socket??(?include/linux/net.h),???????????????????
?,????????????????(???inode,????????type????),????
??????????,? - ...
- net_familiesfamily-gtcreate(sock, protocol)
- ...
- ?????????AF_INET,??????????inet_create()net_famil
ies????,????????(net families)???,???????sock_regi
ster???
45- ?struct socket??????????????struct
sock???,????????????????inet_create?????????,?????
???(??socket????????),??????? - ...
- if (sk-gtprot-gtinit)
- sk-gtprot-gtinit(sk)
- ...
- ?????SOCK_STREAM,???tcp_v4_init_sock???SOCK_D
GRAM???socket?????????,??socket????? - ?inet_create()????,?????sock_map_fd?????????
???????????????file??????????????????????? - ????????????????,????????????????????,?????
???????????
46- 2. ????
- ???A??????,?????????(??sendto???????????)
- ...
- write(sockfd,"Hello",strlen("Hello"))
- ...
- write???????????sys_write,??????????????struc
t file??????????(file????)???(file-gtf_mode
FMODE_WRITE?true),???????????? - ...
- if (file-gtf_op (write file-gtf_op-gtwrite) !
NULL) - ret write(file, buf, count, file-gtf_pos)
- ...
- ??f_op??struct file_operations????,?sock_map
_fd?????socket_file_ops,?????(/net/socket.c)
47- static struct file_operations socket_file_ops
- llseek sock_lseek,
- read sock_read,
- write sock_write,
- poll sock_poll,
- ioctl sock_ioctl,
- mmap sock_mmap,
- open sock_no_open, // special open code to
disallow - open via /proc
- release sock_close,
- fasync sock_fasync,
- readv sock_readv,
- writev sock_writev
-
- ??wirte?????????sock_write,??????????????str
uct msghdr,?????sock_sendmsg.? - ...
- sock-gtops-gtsendmsg(sock, msg, size, scm)
- ...
- ????sock-gtops?inet_create()???????????UDP???
?,sock-gtops???inet_dgram_ops(?sock-gtops
inet_dgram_ops),????net/ipv4/Af_inet.c?
48- struct proto_ops inet_dgram_ops
- family PF_INET,
- release inet_release,
- bind inet_bind,
- connect inet_dgram_connect,
- socketpair sock_no_socketpair,
- accept sock_no_accept,
- getname inet_getname,
- poll datagram_poll,
- ioctl inet_ioctl,
- listen sock_no_listen,
- shutdown inet_shutdown,
- setsockopt inet_setsockopt,
- getsockopt inet_getsockopt,
- sendmsg inet_sendmsg,
- recvmsg inet_recvmsg,
- mmap sock_no_mmap,
-
- ?????inet_sendmsg()??,??????????????????
49- ...
- sk-gtprot-gtsendmsg(sk, msg, size)
- ...
- ?????????????inet_create?
- ...
- protudp_prot
- ...
- ??udp_sendmsg???,????????????UDP?(???,?????)
,?????ip_route_output,??????????,?? - ...
- ip_build_xmit(sk,
- (sk-gtno_check UDP_CSUM_NOXMIT ?
- udp_getfrag_nosum
- udp_getfrag),
- ufh, ulen, ipc, rt, msg-gtmsg_flags)
- ...
- ip_build_xmit????????????sk_buff,???????IP???
50- NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL,
- rt-gtu.dst.dev,output_maybe_reroute)
- ...
- ??????????????,????????????output_maybe_rero
ute,?output_maybe_reroute????? - return skb-gtdst-gtoutput(skb)
- ?????ip_route_output????,ip_route_output?????????,
???????skb-gtdst?(???ip_route_output_slow?rth-gtu.
dst.outputip_output)? - ??ip_output??,???????ip_finish_output????????
????????net_device??,?ip_finish_output?????????ip_
route_output???????????????netfilter?NF_IP_POST_RO
UTING??????,?????ip_finish_output2,??????? - ...
- hh-gthh_output(skb)
- ...
- ?????dev_queue_xmit,?????TCP/IP????,????????
??? - ?????????,??????
51- ...
- dev-gthard_start_xmit(skb, dev)
- ...
- ?????????????????,?????????????,?????3c509??(
??????3c509.c),?????????(el3_probe),? - ...
- dev-gthard_start_xmit el3_start_xmit
- ...
- ?????IO??,?????????????,?????????
- ???????????,???????,????????????????????????
???????????????(???TCP??)?
52- 3. ????
- ???????????,?????????,??????????????????3c509?????
???el3_interrupt(???IRQ???????,????????request_ir
q????)???????????????????IO??,?????(?IO?inw??),???
??????,??el3_rx(dev)?????? - ?el3_rx?,???????????struct sk_buff,???????,???????
??netif_rx(dev.c)????CPU???,???????????????????net
if_rx?????????????sk_buff???????,????????,????????
,????????????? - ...
- _skb_queue_tail(queue-gtinput_pkt_queue,skb)
- _cpu_raise_softirq(this_cpu, NET_RX_SOFTIRQ)
- ...
- ???????,???????????CPU??(??????????)????????schedu
le()?,??????????,????????????
53- ...
- if (softirq_active(this_cpu) softirq_mask(this_c
pu)) - goto handle_softirq
- handle_softirq_back
- ...
- ...
- handle_softirq
- do_softirq()
- goto handle_softirq_back
- ...
- ???????,?????net_dev_init?,????????????net_rx
_action - ...
- open_softirq(NET_TX_SOFTIRQ, net_tx_action,
NULL) - ...
- ??????????????,?????????NET_TX_SOFTIRQ???,???
??net_rx_action? - net_tx_action???2.2????net_bh???????,????????
???????,?????ptype_all,???????ptype_base16??????
?????????OSI7???????????????????????struct
packet_type??,????????dev_add_pack????????ptype_al
l?ptype_base??
54- ??packet_type??type??ETH_P_ALL?,?????ptype_a
ll???,???ip_packet_type,????ptype_base16????????
????????????ETH_P_ALL????,?????????????,?????????
??????? - skb-gtprotocol??el3_rx????,??????????????????
??,??????,????ETH_P_IP,???net_tx_action?,???IP????
??????ip_packet_type ????,??????ip_recv()? - pt_prev-gtfunc(????ip_recv)?????atomic_inc(s
kb-gtusers)??(?2.2??????????skb_clone,????),???????
sk_buff??????????????????????????????sk_buff?(????
)???kfree_skb,?kfree_skb?????????????????,????????
????(_kfree_skb),????????1?
55- ??net/ipv4/ip_input.c????ip_recv???????????
????????(???????????????),???????????????2.4???,??
?????????,??????ip_recv??????,???????ip_recv??????
???ip_rcv_finish????ip_rcv_finish?,??????IP??(????
?)?IP?,??????ip_route_input????,???????skb-gtdst???
???????????????????????????,?????????????????????
???????????,???ip_local_deliver(/net/ipv4/ip_inpu
t.c),????ip_forward(/net/ipv4/ip_forward.c)?skb-gtd
st-gtinput??????????????????? - ??????????,????ip_local_deliver?????????????
??,???????????????,??ip_local_deliver??????????,??
????(???sk_buff???),?????? - ???????netfilter????????????,???/net/ipv4/ip
_input.c?ip_local_deliver_finish??
56- ???(?TCP?UDP?RAW)????????inet_protos?(??inet
_add_protocol)?ip_local_deliver_finish???IP???????
????(?iph-gtprotocol),??????????????,???udp,???ippr
ot-gthandler????udp_rcv?? - ???????????socket???????struct
socket/struct sock???udp_rcv???udp_v4_lookup??????
???sock,?????????udp_queue_rcv_skb(/net/ipv4/udp.c
)??????sock_queue_rcv_skb??,????sk_buff??????,????
??????
57- ...
- kb_set_owner_r(skb, sk)
- skb_queue_tail(sk-gtreceive_queue, skb)
- if (!sk-gtdead)
- sk-gtdata_ready(sk,skb-gtlen)
- return 0
- ...
- sk-gtdata_ready????sock????????(sock_init_data)
- ...
- sk-gtdata_readysock_def_readable
- ...
- ????????
- ??B??????,??????
- ...
- read(sockfd,buff,sizeof(buff))
- ...
- ?????????????sys_read(fs/read_write.c)??????
?write???,?????udp_recvmsg?????skb_recv_datagram,?
????????,?socket???????,?????(signal_pending(curre
nt)),??data_ready???????????????(wake_up_interrupt
ible(sk-gtsleep))?
58- 8.3 ??????
- ??????,???????????(sk_buff)?????????,?????????????
?sk_buff???,?????????????????? - 8.3.1 ????????????
Linux?????????????,?????????????????????????
?,Linux?????????????????????????????,????????????
?????????? ???????????????????,??????????????
????????,????????????????,??,??????????????,??????
??????????????,???????????????????????????????????
?????,????????????????????????,????????,??????????
???,Linux ????????(sk_buff)????????????????Linux??
???????????????????????????????sk_buff,sk_buff
????????????,?????????????????????????????????????
buffer??sk_buffs? ???????,???????????????
sk_buffs??????????????????
? 8.4 Linux ???????(sk_buff)
598.3.2 ???????????
? 8.5 sk_buff ???????
???? ??
Head ??????????????sk_buff ???????????,??????????
data ???????????????????????? sk_buff ???????????
tail ??????????????? data ????,??????????? sk_buff ???????????
end ????????????? head ????,sk_buff ?????,???????????
?? 8.4 ??,?? sk_buff ?????????4?????????????????
???,???????????????????,? 8.5 ????????????
60 sk_buff ???????,len ? truesize,?????????????
?????????????sk_buff ?????????????????????????????
??????,???????????? sk_buff ???? data ? tail
??,?????? 8.6 ??? ? sk_buff ?????,?????????
sk_buff ?????????????????????????????????????
sk_buff ???????? ? 8.6 sk_buff ???????????
???? ??
push ???? data ????????????? len ??????????????,?????????????????????
pull ???? push ???????,?? data ??????????,??? len ?????????????????????????????
put ???? tail ????????????? len ??????????????,?????????????????????
trim ???? put ???????,?? tail ??????????,??? len ?????????????????????????????
61- 8.3.3 ???????????
- ??sk_buff???????????? ????????
????????sk_buffs???????,??????????????
????????????????????,???????????????? - ???????
- void append_frame(char buf,int len)
-
- struct sk_buff skb alloc_skb(len,GFP_ATOMIC)
- if (skb NULL)
- my_dropped
- else
- skb_put(skb,len)
- memcpy(skb-gtdata,data,len)
- skb_append(my_list,skb)
-
-
- void process_queue(void)
-
- struct sk_buff skb
- while ((skb skb_dequeue(my_list)) ! NULL)
- process_data(skb)
62 ? net/core/dev.c ?? netif_rx() ? net_bh()
????????,??????????????????,????????
skb_put() ??????????memcpy?????
???????????????,?????skb_push????????,??????????8.
5??
? 8.5
skb_put?skb_push ??skb_reserve()????????,?????????
????????? skb alloc_skb(lenheadspace,GFP_KERNE
L) skb_reserve(skb,headspace) skb_put(skb,len)
memcpy_fromfs(skb-gtdata,data,len) pass_to_m_proto
col(skb)
63- ???????
- (1) skb_dequeue()
- struct sk_buff _skb_dequeue(struct sk_buff_head
list) - ????????????,??????????? ??? skb_queue_head ?
skb_queue_tail ?????????? - (2) skb_queue_head()
- void skb_queue_head(struct sk_buff_head
list,struct sk_buff newsk) - ????????????????
- (3) skb_queue_tail()
- void skb_queue_tail(struct sk_buff_head
list,struct sk_buff newsk) - ????????????????
- (4) skb_unlink()
- void skb_unlink(struct sk_buff skb)
- ?????????????????????,???????????
64- (5) skb_insert skb_append
- void skb_insert(struct sk_buff old,struct
sk_buff newsk) - void skb_append(struct sk_buff old,struct
sk_buff newsk) - ????????????????????,??????????????????????
- (6) alloc_skb()
- define alloc_skb(size,priority)
- (struct sk_buff ) kmalloc(size,priority)
- ????????sk_buff? ???????? skb-gtfree1 ???????
- (7) kfree_skb()
- void kfree_skb(struct sk_buff skb)
- ??????sk_buff?
- (8) skb_clone()
- struct sk_buff skb_clone(struct sk_buff
skb,int gfp_mask) - ???sk_buff???,?????????
- (9) skb_copy()
- int skb_copy_datagram(struct sk_buff skb,int
offset, - char to,int size)
- ????sk_buff????
65- 8.3.4 ?????????????
- sock_queue_rcv_skb() ????????????????????
- sk my_find_socket(whatever)
- if (sock_queue_rcv_skb(sk,skb) -1)
- myproto_stats?dropped
- kfree_skb(skb,FREE_READ)
- return
-
- ?????????????socket? ?????????,???????
- ????,sock_alloc_send_skb() ????????,??????
- skbsock_alloc_send_skb(sk,????)
- if(skb NULL)
- return -err
- skb-gtsk sk
- skb_reserve(skb,headroom)
- skb_put(skb,len)
- memcpy(skb-gtdata,data,len)
- protocol_do_something(skb)
- ???????? skb-gtsk sk,sock_alloc_send_skb()
?????????socket,????????kfree_skb()?,??sk?????????
???????????,????????????
66- 8.4 ????????
- ?Linux?,????????????????????(packet)???????
- 8.4.1 Linux????????
- ????????????????????,???????????????,???????
????,??????????????????????????????????????????lin
ux/net/core???,??linux/net/core/dev.c???????? - Linux??TCP/IP,IPX,X.25,AppleTalk????,???????
?????linux/net/???????????????TCP/IP
(IPv4)??,??????linux/net/ipv4?,??linux/net/ipv4/af
_inet.c?????????
67 ???????????linux/net/socket.c?????Socket????????
???????????????linux/net/socket.c? 1. ????
?
8.6 ????????? ???Linux?????????????(???????
)??drivers/net/skeleton.c ????????????????????????
?????????????????????,????????????,?netif_rx()??,?
????????????????????????????????????????????,??8.6
???
682. ???? ???Linux??????????,?????????????????
???????????(??????)?
ethn ????
trn ???
sln SLIP??
pppn PPP??
plipn PLIP??
tunln IP IP????
nrn NetROM ????
isdnn ISDN??
dummyn ???
lo ??????
69- 3. ????
- ??register_netdev(struct device )??????
struct device ??????????? ?????????struct
device??????????????? unregister_netdev(struct
device ) ???????????,??????????????????,?????????
,???? struct device dev_get(const char
name)?????????????,??????,???????????????? - ???????????
- int register_my_device(void)
-
- int i 0
- for(i 0i lt 100i)
-
- sprintf(mydevice?name,"mydevd",i)
- if(dev_get(mydevice?name) NULL)
-
- if(register_netdev(mydevice) ! 0)
- return -EIO
- return 0
-
-
- printk("100 mydevs loaded? Unable to load more?
- ")
- return -ENFILE
70- 4. ????????
- ????????????? struct device
?,????????????????? struct device??????? - ?????(name)?????????,????????,???????????eth
n???,???????????? - ??????(Bus Interface Parameters)????????????
?????? - ?????(Protocol Layer Variables)???????????
mtu??
71- 8.4.2 ??????
- ??????????????????,??include/linux/if_arp.h?
28?????ARP??????????????????????????????????,?????
????????,???????????????????????????????3c501?????
???(???linux/drivers/net/3c501.c)??,?????????? - ?????????????????????,?????????????
72- ??????????,?linux/drivers/net/3c501.c?el_sta
rt_xmit() ???????3Com3c501???????????,????????????
????????,????????? - ??????????????????,??????????,?????????linux
/drivers/net/3c501.c?el_interrupt()????,??????????
???????,??????????????,????????????el_interrupt()?
???????????????,??????????el_receive()?el_receive(
)????????????,???????????????????(dev_alloc_skb(
)),?????????????????,??????net/core/dev.c??????net
if_rx(),??????? - ????????????????,????????????????,??????????
??????????
73- ???????,???????????net/core/dev.c???netif_rx
()?????,????????????????????,?????????????????????
?,?????????????????????? - ???????????????????????????????????,????????
???????,??????????????????????dev_base??,??linux/i
nclude/linux/netdevice.h ????structnet_device
dev_base?????????????????????????,?????????(?incl
ude/linux/netdevice.h????)?net_device??,??????????
?????????????
74- struct net_device
-
- open()
- stop()
- hard_start_xmit()
- hard_header()
- rebuild_header()
- set_mac_address()
- do_ioctl()
- set_config()
- hard_header_cache()
- header_cache_update()
- change_mtu()
- tx_timeout()
- hard_header_parse()
- neigh_setup()
- accept_fastpath()
-
-
75- ????????????????????,????dev_base???????,????
???????????net_device?????????????dev_base????????
????linux/drivers/net/net_init.c????register_netde
v(dev_3c50)????????????net_device????????????????
????/drivers/net/3c501.c??el1_probe1()???? - el1_probe1()
-
- dev-gtopen el_open
- dev-gthard_start_xmit el_start_xmit
- dev-gttx_timeout el_timeout
- dev-gtwatchdog_timeo HZ
- dev-gtstop el1_close
- dev-gtget_stats el1_get_stats
- dev-gtset_multicast_list set_multicast_list
-
- ether_setup(dev)
-
-
- ?????????drivers/net/net_init.c??ether_setup
(dev)???? - ??dev-gthard_start_xmit el_start_xmit,??????
?????????????dev-gthard_start_xmit?????,el_start_x
mit????????????????????
76- 8.4.3 ??????
- ??????????????????,?????????????????????????
??????????????? - ???????????net/core/dev.c?dev_queue_xmit()??
????????????????IP,??ARP??,???????????????????,???
?????????????dev_queue_xmit()?????????dev-gthard_st
art_xmit(),dev-gthard_start_xmit()?????????????????
?????,??dev-gthard_start_xmit()???????el_start_xmit
()?
77- ???????,?????????net/core/dev.c
????netif_rx()???????????,????????????????????????
?????,???????????????????????????????????????,??,?
?dev_base?????????????????????????????????????
net/core/dev.c ?static struct packet_ptype_base16
?????????????????????????,????????????? - ????,IP?????????ip_rcv()???,?ARP?????arp_rcv
()?,???????????????????????????
78- ??????????????????????,?????net/core/dev.c??
dev_add_pack()???dev_remove_pack()???Ip?????net/ip
v4/ip_output.c ???????void _init ip_init(void)??? -
-
- dev_add_pack(ip_packet_type)
-
79- ?????????net/core/dev.c ????netif_rx()??????
??????,?????????,??????????,????????cpu_raise_soft
irq (this_cpu?NET_RX_SOFTIRQ)???????,
?open_softirq(NET_RX_SOFTIRQ, net_rx_action,
NULL)????,NET_RX_SOFTIRQ???????????net/core/dev.c?
?net_rx_action()?net_rx_action()?????????????ptype
_base16????????,?????????????,????????????,?????
?????,???????????net_rx_action()??pt_prev-gtfunc()?
?????????IP????,ptype_baseETH_P_IP-gtfunc()(ip_rc
v()),??????????IP???
80- 8.4.4 ??????
- ??????????????????linux/include/linux/socket
.h?,Linux?BSD Socket?????32???????,??PF_INET??????
TCP/IP???(IPv4, ????????IPv4)???????????,?????????
????TCP/IP?????????inux/net/ipv4/????,linux/net/ip
v4/af_inet.c????????? - ?Linux2.4.x??,???TCP/IP???????IGMP?TCP?UDP?I
CMP?ARP?IP?????????,IP?ARP????????????????????,???
?????????(core)???????????????(TCP?UDP?IGMP?ICMP)?
??????IP???,???IP??????,????IP??????,???????Socket
???????????????IP?????????,??????????,????????????
???????
81- ?IP????,??????(core) ?????IP????,??ptype_bas
eETH_P_IP???IP???????IP???ip_packet_type-gtip_rcv
()?????????IP?,????IP???????ip_rcv()(linux/net/ipv
4/ip_input.c)??????ip_rcv()??????IP???????checksum
?????,????????????????????ip_rcv_finish()(???????
NF_HOOK????)???,ip_rcv_finish()????????IP????????I
P??????????,??????????????????????/linux/net/ipv4/
route.c???ip_route_input()??????????,?????????? - (1)???????(???????TCP,UDP,IGMP???????)
- (2)?????????(????NAT??????)
- (3)?????????(??????)
82- ?????????,ip_route_input()????net/ipv4/route
.c?ip_route_input_slow(),?ip_route_input_slow()???
rth-gtu.dst.inputip_local_deliver,?????IP????????,
?????????????????????????,???ip_rcv_finish()?ip_rc
v_finish()?????skb-gtdst-gtinput(skb),????????ip_loc
al_deliver()??,ip_local_deliver()??????ip_local_de
liver_finish()????????????? - ???????(core)??????ptype_base16???????????
?????????,?/linux/net/ipv4/protocol.c?,??????????
?????struct net_protocolinet_protosMAX_INET_PROT
OS,?????????IP????????????(IGMP,TCP,UDP,ICMP)????
??????????TCP???????
83- linux/net/ipv4/protocol.c line67
- static struct inet_protocol tcp_protocol
- handlertcp_v4_rcv,// ???????
- err_handlertcp_v4_err,// ???????
- nextIPPROTO_PREVIOUS,
- protocolIPPROTO_TCP,
- name"TCP"
-
- ???????linux/net/ipv4/protocol.c,IP?????????
?????????TCP???linux/net/ipv4/protocol.c???,??????
?????????igmp_rcv()?udp_rcv()?icmp_rcv()??????????
?,???inet_protosMAX_INET_PROTOS???????????inet_a
dd_protocol()???,???????inet_del_protocol()????ine
t_protosMAX_INET_PROTOS???????linux/net/ipv4/af_
inet.c inet_init()???????? - inet_init()
-
- printk(KERN_INFO "IP Protocols")
- for (p inet_protocol_base p ! NULL)
- struct inet_protocol tmp (struct inet_protocol
) p-gtnext - inet_add_protocol(p)// ????
- printk("ss",p-gtname,tmp?", ""\n")
- p tmp
-
84- ???Linux??????????????, ??linux?????dmesg???
???????????? - IP Protocols ICMP,UDP,TCP,IGMP
- ??,??inet_protos ????ICMP?UDP?TCP?IGMP????
?inet_protocol????,??????????????????? - Linux 2.4.x?linux/include/linux/socket.h????
32????BSDsocket??,????TCP/IP?IPX/SPX?X.25?,???????
????????TCP/IP????TCP????????,???UDP??????????????
????,??????????????,???????socket????? - ?BSD socket????????,????????????????????????
?????TCP?????????
85- sock_descriptor socket(AF_INET,SOCK_STREAM,0)
- connect(sock_descriptor, ??,)
- send(sock_descriptor,hello world)
- recv(sock_descriptor,buffer,1024,0)
- ??????????Inet??,?TCP/IP??,????????????,????
??TCP??,?????????socket????????? - ????,??socket?????????????(???AF_INET),???32
??????????????????,????????,????????????????????,?
????????????????,Inet???????TCP???
86- ???????????????,??????????????,?????????????
?????????????,????????????,??????????linux/net/soc
ket.c??????? - staticstructnet_proto_family net_familiesNPROTO
- ??????????,net_families2?TCP/IP??,net_fami
lies3?X.25??,???????????,?include/linux/socket.h
??????????????net_proto_family?ops???,????????????
????????????????ops???????sock_register()(linux/ne
t/socket.c)???????,??TCP/IP??????????? - int _init inet_init(void) (net/ipv4/af_inet.c)
-
- (void) sock_register(inet_family_ops)
-
- ????AF_INET(??????2),?????net_failies2
?????????
87- ????????,??????????????????????????????????,
??????????????????TCP/IP????,?????????
net/ipv4/af_inet.c??struct list_head
inetswSOCK_MAX???????????????????,????net/ipv4/a
f_inet.c???????inetsw_array - static struct inet_protosw inetsw_array
-
-
- typeSOCK_STREAM,
- protocolIPPROTO_TCP,
- prottcp_prot,
- opsinet_stream_ops,
- capability-1,
- no_check0,
- flagsINET_PROTOSW_PERMANENT,
- ,
-
- typeSOCK_DGRAM,
- protocolIPPROTO_UDP,
- protudp_prot,
- opsinet_dgram_ops,
- capability-1,
- no_checkUDP_CSUM_DEFAULT,
88- ????,SOCK_STREAM????TCP??,SOCK_DGRAM????UDP?
?,SOCK_RAW????IP???????????inet_register_protosw()
?inetsw_array?????????inetswSOCK_MAX??????inet_i
nit() (net/ipv4/af_inet.c) ????????? - ???????????socket,???accept?send()?connect()
?release()?bind()????????????ops?prot?????????????
TCP?? -
- typeSOCK_STREAM,
- protocolIPPROTO_TCP,
- prottcp_prot,
- opsinet_stream_ops,
- capability-1,
- no_check0,
- flagsINET_PROTOSW_PERMANENT,
- ,
- ???? tcp_prot???
89- struct proto tcp_prot
- name"TCP",
- closetcp_close,
- connecttcp_v4_connect,
- disconnecttcp_disconnect,
- accepttcp_accept,
- ioctltcp_ioctl,
- inittcp_v4_init_sock,
- destroytcp_v4_destroy_sock,
- shutdowntcp_shutdown,
- setsockopttcp_setsockopt,
- getsockopttcp_getsockopt,
- sendmsgtcp_sendmsg,
- recvmsgtcp_recvmsg,
- backlog_rcvtcp_v4_do_rcv,
- hashtcp_v4_hash,
- unhashtcp_unhash,
- get_porttcp_v4_get_port,
-
90- 8.4.5 Socket???????
- ????socket()?bind()?connect()?accept?send()?
release()???linux/net/socket.c?????,??????????????
???????sys_???? - ?????socket()?????,Socket(AF_INET,SOCK_STREA
M,0)?????sys_socket(),sys_socket()????socket_creat
()socket_creat()???????????????net_families????
?????,???????????????????????,??????????create()??
??????????AF_INET,inet_creat()?????,?inet_creat()?
??????inetswSOCK_MAX???????,??????????socket,??S
OCK_STREAM,TCP?????, - inet_creat()
- answerinetsw ????????
- sock-gtops answer-gtops
- sk-gtprot answer-gtprot
91- 8.5 IP ?
- 8.5.1 ?? IP ???
- ???? device ??????? dev_base
??,???????????,?????????????? dev_base ???????
device ???????????? device ???????????,?????????,?
??????????????????????????????,???????????????????
????????????????????????,????????????? sk_buff
??????????????????,???? sk_buff ??????? backlog
??????? backlog ???????,???? sk_buff ???????????
sk_buff ??? backlog ???,?????????????????,????????
?????????????
92- ??????????????????,??,?????????????????????,
?????,??????????? sk_buff ??? backlog
?????????????????????????????? - ? Linux ??????????,?????? ptype_all ???
ptype_base ?????? packet_type ??????????packet_typ
e ????????????????????????????????????????????????
???packet_type ??????????? ptype_all??????????????
???,?????? ptype_all ???ptype_base
??????,??????????????,????????????????????????????
????????,??????????????? sk_buff ????????
packet_type ?????packet_type ????????(??????????),
??,????????????? sk_buff,sk_buff??????????????????
???
93- 8.5.2 ?? IP ???
- ????????????,?????????(??????)???????????,????????
?? sk_buff ????????,?????????????,??????????????? - sk_buff ??????????????,??,IP ??????????????,??????
???????????????????????? PPP ??????????,??????????
???????????????,? PPP ??????????????????????????,?
??????????,??????????????????????
94- ??????? IP ???,IP ????????? IP
?????????????????????? IP ??,??????? rtable
????????????????????? IP ???????? device
?????????????????????????????????,????????????????
????????????,???????? 8.2,????????????????????????
???????,????????????????????????? IP
???,????????????????????????????????? ARP
????,?????,?????????? ARP ????????????????????????
?????????,??????????? IP ??????? ARP ???????
95- 8.5.3 ?????????
- ????????????????,???????????????????????????
????????,IP ????????????????????????????????????,I
P ???????????,?????????????? - ? IP ????????,IP ? IP ????????? IP
????????,??????? device ?????????? mtu
??,????????????(?????)?????? mtu ??????? IP
??????,????? IP ??????????(mtu ?????)????????
sk_buff ??,??? IP ?????????,?????? IP
????????????????????? IP ?????????? IP ????
sk_buff,??????
96- IP ?????????????????,?? IP
?????????????,??????,???????????????? IP ????,IP
???????????????????????????,IP ?????? ipq
????,???????????? IP ????? ipqueue ???????? IP
?????,IP ????? ipq ????,?????? ipfrag
???????????? ipq ?????????????IP ??????????????
IP ?????,???????????? IP ???????????????,?????????
sk_buff ??????????????????????????????,ipq ?????
ipfrag ???,?????????????,??,?????????????????????
97- 8.5.4??????
- IP?????????????????????????,IP??????????,??
???????????????????????,??? IP ????????????,??????
??? IP ???? sk_buff ?????????????,IP ?????????IP
?????????????,????,?????????????????????????,Linux
????????????????????????????,????????????????????
???????????????????,????????? ARP ????? IP
?????????? - ARP ??????????ARP ???? ARP ???ARP
?????????? IP ??,? ARP ????????? IP ??????????ARP
????????,??,???????,????????????????? ARP
?????,??? IP ?????????? ARP ??,??????????? ARP
????
98? 8.7 arp_table ????????
?? ??
?????? ? ARP ???????????
?????? ? ARP ???????????
?? ??????????,??????????
IP ?? ??????? IP ???
???? ?????????
??? ???????????
??? ?? timer_list ?????,???? ARP ????????
???? ? ARP ?????????
sk_buff ?? ????? IP ??? sk_buff ????
Linux ?? ARP ???????? arp_table
?????,??????????? IP ???????????????????? IP
?????,???????????? arp_table ???????????? 8.7 ???
99- ARP ???????(? arp_tables ??)??,???????
arp_table ????????????????,???????????????? IP
??????????????????????,?????????????? arp_table
??????,Linux ??????????????,???? arp_table ???
hh_cache ?????? - ??????? IP ?????,???????? arp_table ??,ARP
???? ARP ????????????????? arp_talbe
??,??????????? sk_buff ? arp_table ??? sk_buff
???????????????? IP ??? sk_buff ??,??? sk_buff
??????????,????????? ARP ??????UDP ???????????,?
TCP ???????? TCP ??????????? IP
???????????????,arp_table ??????????,???? sk_buff
??????????????????????? sk_buff ????
100- ARP ??????????? IP ??? ARP ???ARP ?????????
packet_type ??????????????,??,???????? ARP
????????? ARP ????????? ARP ???,???????????
device ???????????? ARP ????? - ?????????????ARP?????????????????,??????????
????????????????????????(neighbor
cache)?,?????????arp cache??????????arp?????neighb
or cache?????????/proc/net/arp? - ??neighbor cache????????neighbour?????????h
a,?????????????????????????hh_cache?????,hh_cache?
??????????????????????????????????,??????????????
????????????????
101- ??????????????,? IP ??????????????????,?
DHCP ???,????? IP ????????????? ARP ?????????,
ARP ??????????????? arp_table ????????????????????
??,????????????????????????? arp_table
???????,????????????????? ARP ??????,????
arp_table ?????????????????????,? ARP
???????????,?????????,??????????? ARP ?????
102- 8.5.5 IP ??
- IP???????????????????????????????????????
,?????????????????????? IP ????,??????????????????
????????,?????????????????????????????,???????????
???????IP ?????????????????????????????????,??????
??????,??????????????? IP ????????????????????????
?????,?????,????????? IP ????????????,????????????
???,??????????????????????
103- ?????? BSD ?????? IOCTL ????????????????????
??????INET ?????????????????????? IP
???????????????,????????????????????????????,?????
?????????????????,??????????????? IP
???????????????????????????????(gated)?????,???
BSD ?????? IOCTL ???????? - ???OSPF??BGP???????,????????????????????????
??????????,????????????????????????????,??????????
,?????????? - Linux?????????????????????(Routing
Infomation Base,RIB),??????????(Forwarding
Infomation Base,FIB)?
104- 1. ????
- ????????????,????????FIB?????????????,??????
?????????,????????????????????????????,??????????
??????????,???????????????????????/proc/net/rt_cac
he?????? - ????? IP ???,???????????????????????,???????
???????????????????????????,IP ??????????,????????
???????????????????,??????????,??????????????????
105- ?????????? (ip_rt_hash_table),??????????
rtable ??????????????????? IP ????????????????????
????????? IP ???????????,???????????????? rtable
???????,??? IP ???????? IP ???????? device
????,?????????????????????????????????????????????
(? jiffies ??)?????????,?????????????????????????
?????????,?????????????????????? rtable
??????,??????????????????????????????,??? rtable
????,????????????,?????????? rtable
?????????????????,??????????????????????????????,?
?,???????,???????
106- ?????????????????rt_hash_table??????????IP
??????????,?????????????????,Linux???????????????,
????????????????????????????????? - 2. ???????
- ?????(Forwarding Infomation
Base,FIB)????????,???????????????????????FIB??????
???,?????????????????FIB???????????,??????????????
??? - ? 8.7??????????????????????????????,????????
????????,?????????????????????? IP
???,????????????,?????????????????????????????????
????? - ?? IP ????? fib_zone ?????????? fib_zones
???????????? fib_zone,?????????? IP
????????????????????? fib_node ? fib_info
??????,?????????? fib_zone ??????fz_list
???????????????,?????????????? fib_node ?????
107(No Transcript)
108- ????? IP ??,????????,?????????????????????
IP ????????????????????????,????,?????????????,???
????????????????????????? metric,????????????????,
??? metric ????????,??????? IP ????,??? metric
???,??????
109- ?????
- 1. ??????????????????????
- 2. ?????????????,????????????????
- 3. ??????????,???????????????????NOS???,??,NOS????
??????? - 4.???????????????????????????????????????
- 5.???????????????????????
- 6.???????,NOS???????????????,NOS?????????
- 7.??????????NOS???????????
- 8.??????send??????(??)????????????????
110- 9.??????,????????????
- 10.RPC???????????????????????????????
- 11.?????????????(??????,????????,????????????????
?lt??,????,?????,????,?????gt) - 13.socket?????????????
- 14.????socket????????????????
- 15.????????????????????????
- 16.??????,???????????????(??)????????????