加入收藏 | 设为首页 | 会员中心 | 我要投稿 淮北站长网 (https://www.0561zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核--网络栈实现分析(二)--数据包的传递过程--转

发布时间:2021-01-24 09:17:01 所属栏目:Linux 来源:网络整理
导读:副标题#e# 转载地址 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析、”(下)“表示分析是从上向下分析。 ?上篇: 上一篇博文中我们从宏观上分析

<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools">
[cpp]?<a class="ViewSource" title="view plain" href="http://blog.csdn.net/geekcome/article/details/7492423"&gt;view plain<a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/geekcome/article/details/7492423"&gt;copy

?
  1. ?
  2. ???
  3. ????unsigned??daddr,?unsigned??len,??
  4. {??
  5. ?????sock?*sk;??
  6. ??????
  7. ????{??
  8. ????????(0);??
  9. ??
  10. ????{??
  11. ????????(0);??
  12. ????
  13. ????
  14. pkt_type!=PACKET_HOST)??
  15. ????{??
  16. ????????(0);??
  17. ????
  18. h.th;??
  19. ??
  20. ?
  21. ??
  22. dest,?saddr,?th->source,?daddr);??
  23. ??
  24. ?
  25. ?
  26. ?
  27. ??
  28. ?????(sk!=NULL?&&?(sk->zapped?||?sk->state==TCP_CLOSE))??
  29. ??
  30. ????{??
  31. ????????{??
  32. sk?=?NULL;??
  33. ????????????kfree_skb(skb,FREE_READ);??
  34. ?
  35. ??
  36. ????????}??
  37. seq?=?ntohl(th->seq);??
  38. ??
  39. ?????????(sk?==?NULL)???
  40. ?????????????
  41. ??
  42. ip_hdr->tos,255);??
  43. ????????????skb->sk?=?NULL;??
  44. ?
  45. ????????????kfree_skb(skb,?FREE_READ);??
  46. ????????}??
  47. ????????skb->len?=?len;??
  48. acked?=?0;??
  49. ????????skb->used?=?0;??
  50. free?=?0;??
  51. ????????skb->saddr?=?daddr;??
  52. daddr?=?saddr;??
  53. ??????
  54. ????????cli();??
  55. inuse)???
  56. ????????{??
  57. back_log,?skb);??
  58. ????????????sti();??
  59. ????????}??
  60. inuse?=?1;??
  61. ????????sti();??
  62. ??????
  63. ?????????(sk==NULL)???
  64. ????????????tcp_reset(daddr,255);??
  65. sk?=?NULL;??
  66. ????????????kfree_skb(skb,?FREE_READ);??
  67. ????????}??
  68. ??
  69. ?????(!sk->prot)???
  70. ????????printk();??
  71. ????}??
  72. ??
  73. ?
  74. ???????
  75. rmem_alloc?+?skb->mem_len?>=?sk->rcvbuf)???
  76. ????{??
  77. ????????release_sock(sk);??
  78. ????}??
  79. ????skb->sk=sk;??
  80. rmem_alloc?+=?skb->mem_len;??
  81. ??
  82. ?
  83. ?
  84. ??
  85. ????(sk->state!=TCP_ESTABLISHED)?????????
  86. ??????
  87. ?
  88. ???????
  89. state==TCP_LISTEN)??
  90. ????????{??
  91. ack)????
  92. ????????????????tcp_reset(daddr,saddr,th,sk->prot,opt,sk->ip_tos,?sk->ip_ttl);??
  93. ?????????????
  94. ?
  95. ?
  96. ?????????????????
  97. rst?||?!th->syn?||?th->ack?||?ip_chk_addr(daddr)!=IS_MYADDR)??
  98. ????????????{??
  99. ????????????????release_sock(sk);??
  100. ????????????}??
  101. ?????????????
  102. ??
  103. ????????????tcp_conn_request(sk,?daddr,?tcp_init_seq());??
  104. ?????????????
  105. ?
  106. ?
  107. ?
  108. ???????????????
  109. ?????????????0;??
  110. ??????
  111. ?????????(sk->state?==?TCP_SYN_RECV?&&?th->syn?&&?th->seq+1?==?sk->acked_seq)??
  112. ????????????kfree_skb(skb,?FREE_READ);??
  113. ?????????????0;??
  114. ??????????
  115. ?
  116. ??
  117. ????????(sk->state==TCP_SYN_SENT)??
  118. ??????????????
  119. ack)??
  120. ????????????{??
  121. ????????????????(!tcp_ack(sk,len))??
  122. ?????????????????????
  123. ????????????????????tcp_statistics.TcpAttemptFails++;??
  124. ????????????????????????sk->prot,sk->ip_ttl);??
  125. ????????????????????release_sock(sk);??
  126. ????????????????}??
  127. rst)??
  128. ?????????????????????tcp_std_reset(sk,skb);??
  129. syn)??
  130. ????????????????{??
  131. ??
  132. ????????????????????release_sock(sk);??
  133. ????????????????}??
  134. ?
  135. ??
  136. ????????????????sk->acked_seq=th->seq+1;??
  137. fin_seq=th->seq;??
  138. ????????????????tcp_send_ack(sk->sent_seq,sk->acked_seq,sk,sk->daddr);??
  139. ????????????????tcp_options(sk,th);??
  140. dummy_th.dest=th->source;??
  141. ????????????????sk->copied_seq?=?sk->acked_seq;??
  142. dead)??
  143. ????????????????{??
  144. state_change(sk);??
  145. ????????????????????sock_wake_async(sk->socket,?0);??
  146. ????????????????(sk->max_window==0)??
  147. ????????????????????sk->max_window?=?32;??
  148. mss?=?min(sk->max_window,?sk->mtu);??
  149. ????????????????}??
  150. ??????????????
  151. ??????????????????
  152. syn?&&?!th->rst)??
  153. ????????????????{??
  154. ??
  155. saddr==saddr?&&?sk->daddr==daddr?&&??
  156. ????????????????????????sk->dummy_th.source==th->source?&&??
  157. dummy_th.dest==th->dest)??
  158. ????????????????????{??
  159. ?????????????????????????tcp_std_reset(sk,skb);??
  160. ????????????????????tcp_set_state(sk,TCP_SYN_RECV);??
  161. ?????????????????????
  162. ?
  163. ????????????????}?????????
  164. ????????????????kfree_skb(skb,?FREE_READ);??
  165. ?????????????????0;??
  166. ?????????????
  167. ??
  168. ????????}??
  169. ?????
  170. ?
  171. ??
  172. ??
  173. ?????????(sk->state?==?TCP_TIME_WAIT?&&?th->syn?&&?sk->dead?&&???
  174. seq,?sk->acked_seq)?&&?!th->rst)??
  175. ????????{??
  176. write_seq;??
  177. ????????????(sk->debug)??
  178. ????????????tcp_statistics.TcpEstabResets++;?????????
  179. rmem_alloc?-=?skb->mem_len;??
  180. ????????????skb->sk?=?NULL;??
  181. err=ECONNRESET;??
  182. ????????????tcp_set_state(sk,?TCP_CLOSE);??
  183. shutdown?=?SHUTDOWN_MASK;??
  184. ????????????release_sock(sk);??
  185. ?????????????(sk?&&?sk->state==TCP_LISTEN)??
  186. ????????????????sk->inuse=1;??
  187. sk?=?sk;??
  188. ????????????????sk->rmem_alloc?+=?skb->mem_len;??
  189. ????????????????release_sock(sk);??
  190. ????????????}??
  191. ?????????????0;??
  192. ??
  193. ??
  194. ?
  195. ?
  196. ??????
  197. ????{??
  198. ????????release_sock(sk);??
  199. ????}??
  200. ????(th->rst)??
  201. ??????
  202. ?
  203. ???????
  204. syn?&&?!syn_ok)??
  205. ????{??
  206. ip_hdr->tos,?255);??
  207. ?????????tcp_std_reset(sk,skb);?????
  208. ??
  209. ?
  210. ???????
  211. ????(th->ack?&&?!tcp_ack(sk,len))??
  212. ?????????
  213. ??
  214. ????????(sk->state==TCP_SYN_RECV)??
  215. ????????????tcp_reset(daddr,sk->ip_ttl);??
  216. ????????kfree_skb(skb,?FREE_READ);??
  217. ?????????0;??
  218. ??????
  219. ??
  220. ?
  221. ??????????
  222. ????{??
  223. ????????release_sock(sk);??
  224. ????}??
  225. ??????
  226. ?
  227. ??????
  228. ????????release_sock(sk);??
  229. ????}??
  230. ?????
  231. ???
  232. ????release_sock(sk);??
  233. }??

4、应用层

(编辑:淮北站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读