{"id":92122,"date":"2026-08-09T12:16:50","date_gmt":"2026-08-09T04:16:50","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/92122.html"},"modified":"2026-08-09T12:16:50","modified_gmt":"2026-08-09T04:16:50","slug":"tcpip-sys-%e4%bc%a0%e8%be%93%e5%b1%82-tcp-%e8%af%a6%e7%bb%86%e5%88%86%e6%9e%90","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/92122.html","title":{"rendered":"tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790"},"content":{"rendered":"<h2>tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790<\/h2>\n<h3>\u76ee\u5f55<\/h3>\n<li>\u6982\u8ff0<\/li>\n<li>TCP \u5c42\u6574\u4f53\u67b6\u6784<\/li>\n<li>TCP \u62a5\u6587\u683c\u5f0f<\/li>\n<li>TCP \u72b6\u6001\u673a<\/li>\n<li>\u8fde\u63a5\u7aef\u70b9\u7ed3\u6784 (CONNECTION_ENDPOINT)<\/li>\n<li>TDI_BUCKET \u4e0e IRP \u961f\u5217\u6a21\u578b<\/li>\n<li>\u8fde\u63a5\u7ba1\u7406<\/li>\n<li>\u76d1\u542c\u4e0e\u63a5\u53d7<\/li>\n<li>\u6570\u636e\u53d1\u9001\u8def\u5f84<\/li>\n<li>\u6570\u636e\u63a5\u6536\u8def\u5f84<\/li>\n<li>\u4e8b\u4ef6\u5904\u7406\u5668<\/li>\n<li>lwIP \u7c98\u5408\u5c42\u4e0e tcpip \u7ebf\u7a0b\u6a21\u578b<\/li>\n<li>\u65ad\u5f00\u4e0e\u6e05\u7406<\/li>\n<li>\u5de5\u4f5c\u6d41\u7a0b\u56fe<\/li>\n<li>\u6570\u636e\u6d41\u56fe<\/li>\n<li>\u5173\u952e\u51fd\u6570\u7d22\u5f15<\/li>\n<hr \/>\n<h3>1. \u6982\u8ff0<\/h3>\n<p>TCP (Transmission Control Protocol&#xff0c;\u4f20\u8f93\u63a7\u5236\u534f\u8bae) \u662f TCP\/IP \u534f\u8bae\u6808\u4e2d\u9762\u5411\u8fde\u63a5\u7684\u53ef\u9760\u4f20\u8f93\u534f\u8bae&#xff0c;\u63d0\u4f9b\u6709\u5e8f\u3001\u53ef\u9760\u3001\u5168\u53cc\u5de5\u7684\u5b57\u8282\u6d41\u670d\u52a1\u3002\u5728 ReactOS tcpip.sys \u4e2d&#xff0c;TCP \u5c42\u4f4d\u4e8e TDI \u63a5\u53e3\u4e0e IP \u5c42\u4e4b\u95f4\u3002<\/p>\n<h4>1.1 \u67b6\u6784\u7279\u70b9<\/h4>\n<p>ReactOS \u7684 TCP \u5b9e\u73b0\u91c7\u7528\u5206\u5c42\u7ed3\u6784&#xff1a;<\/p>\n<li>TDI \u5305\u88c5\u5c42 (ip\/transport\/tcp\/)&#xff1a;\u7ba1\u7406 CONNECTION_ENDPOINT\u3001TDI_BUCKET IRP \u961f\u5217&#xff0c;\u9762\u5411 TDI \u63a5\u53e3<\/li>\n<li>lwIP \u7c98\u5408\u5c42 (ip\/lwip_glue\/tcp.c)&#xff1a;\u901a\u8fc7 LibTCP* \u51fd\u6570\u6865\u63a5\u5230 lwIP<\/li>\n<li>lwIP \u6838\u5fc3 (lwip\/src\/core\/tcp*.c)&#xff1a;\u5b9e\u73b0\u5b8c\u6574\u7684 TCP \u72b6\u6001\u673a\u3001\u62e5\u585e\u63a7\u5236\u3001\u91cd\u4f20\u7b49<\/li>\n<h4>1.2 TCP \u7279\u6027<\/h4>\n<table>\n<tr>\u7279\u6027\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>\u9762\u5411\u8fde\u63a5<\/td>\n<td>\u4e09\u6b21\u63e1\u624b\u5efa\u7acb\u8fde\u63a5&#xff0c;\u56db\u6b21\u6325\u624b\u65ad\u5f00<\/td>\n<\/tr>\n<tr>\n<td>\u53ef\u9760\u4f20\u8f93<\/td>\n<td>\u786e\u8ba4 (ACK) &#043; \u8d85\u65f6\u91cd\u4f20<\/td>\n<\/tr>\n<tr>\n<td>\u6709\u5e8f\u4ea4\u4ed8<\/td>\n<td>\u5e8f\u53f7\u673a\u5236\u4fdd\u8bc1\u5b57\u8282\u6d41\u6709\u5e8f<\/td>\n<\/tr>\n<tr>\n<td>\u6d41\u91cf\u63a7\u5236<\/td>\n<td>\u6ed1\u52a8\u7a97\u53e3 &#043; \u7a97\u53e3\u901a\u544a<\/td>\n<\/tr>\n<tr>\n<td>\u62e5\u585e\u63a7\u5236<\/td>\n<td>\u6162\u542f\u52a8 &#043; \u62e5\u585e\u907f\u514d &#043; \u5feb\u901f\u91cd\u4f20\/\u6062\u590d<\/td>\n<\/tr>\n<tr>\n<td>\u5168\u53cc\u5de5<\/td>\n<td>\u53cc\u65b9\u53ef\u540c\u65f6\u6536\u53d1<\/td>\n<\/tr>\n<tr>\n<td>\u5b57\u8282\u6d41<\/td>\n<td>\u65e0\u62a5\u6587\u8fb9\u754c&#xff0c;\u9762\u5411\u5b57\u8282\u6d41<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>2. TCP \u5c42\u6574\u4f53\u67b6\u6784<\/h3>\n<h4>2.1 \u4e09\u5c42\u7ed3\u6784<\/h4>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 TDI \u63a5\u53e3\u5c42 (\u4e0a\u5c42: AFD.sys \/ TDI \u5ba2\u6237\u7aef)                  \u2502<br \/>\n\u2502   TDI_CONNECT \/ TDI_LISTEN \/ TDI_ACCEPT                 \u2502<br \/>\n\u2502   TDI_SEND \/ TDI_RECEIVE \/ TDI_DISCONNECT               \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n                       \u2502<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 TCP \u5305\u88c5\u5c42 (ip\/transport\/tcp\/) \u2190\u2605                       \u2502<br \/>\n\u2502                                                        \u2502<br \/>\n\u2502  tcp.c    : TCPSocket\/TCPConnect\/TCPSendData\/TCPReceiveData<br \/>\n\u2502  accept.c : TCPListen\/TCPAccept\/TCPAbortListenForSocket \u2502<br \/>\n\u2502  event.c  : TCP*EventHandlers \/ Flush*Queue             \u2502<br \/>\n\u2502  if.c     : \u63a5\u53e3\u66f4\u65b0 (TCPUpdateInterface*)              \u2502<br \/>\n\u2502                                                        \u2502<br \/>\n\u2502  \u6838\u5fc3\u5bf9\u8c61: CONNECTION_ENDPOINT &#043; TDI_BUCKET \u961f\u5217         \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n                       \u2502 LibTCP* \u8c03\u7528<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 lwIP \u7c98\u5408\u5c42 (ip\/lwip_glue\/tcp.c)                        \u2502<br \/>\n\u2502  LibTCPSocket\/LibTCPConnect\/LibTCPSend\/LibTCPListen&#8230;  \u2502<br \/>\n\u2502  \u901a\u8fc7 tcpip_callback \u6392\u961f\u5230 tcpip \u7ebf\u7a0b                   \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n                       \u2502 lwIP raw API<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 lwIP TCP \u6838\u5fc3 (lwip\/src\/core\/tcp.c\/tcp_in.c\/tcp_out.c)  \u2502<br \/>\n\u2502  struct tcp_pcb (\u534f\u8bae\u63a7\u5236\u5757)                             \u2502<br \/>\n\u2502  \u72b6\u6001\u673a \/ \u91cd\u4f20 \/ \u62e5\u585e\u63a7\u5236 \/ \u6ed1\u52a8\u7a97\u53e3                      \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n                       \u2502 LibIPInsertPacket \/ tcp_output<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 IP \u7f51\u7edc\u5c42                                               \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<h4>2.2 \u6e90\u7801\u6587\u4ef6<\/h4>\n<table>\n<tr>\u6e90\u6587\u4ef6\u804c\u8d23<\/tr>\n<tbody>\n<tr>\n<td>ip\/transport\/tcp\/tcp.c<\/td>\n<td>\u6838\u5fc3&#xff1a;TCPSocket\/TCPConnect\/TCPSendData\/TCPReceiveData\/TCPDisconnect<\/td>\n<\/tr>\n<tr>\n<td>ip\/transport\/tcp\/accept.c<\/td>\n<td>\u76d1\u542c\/\u63a5\u53d7&#xff1a;TCPListen\/TCPAccept\/TCPCheckPeerForAccept<\/td>\n<\/tr>\n<tr>\n<td>ip\/transport\/tcp\/event.c<\/td>\n<td>\u4e8b\u4ef6\u5904\u7406&#xff1a;TCPEventHandlers\u3001FlushQueue<\/td>\n<\/tr>\n<tr>\n<td>ip\/transport\/tcp\/if.c<\/td>\n<td>\u63a5\u53e3\u7ed1\u5b9a&#xff1a;TCPUpdateInterfaceIPInformation\/LinkStatus<\/td>\n<\/tr>\n<tr>\n<td>ip\/lwip_glue\/tcp.c<\/td>\n<td>lwIP \u6865\u63a5&#xff1a;LibTCP* \u7cfb\u5217\u51fd\u6570<\/td>\n<\/tr>\n<tr>\n<td>include\/tcpcore.h<\/td>\n<td>\u4fdd\u7559\u7684 Linux 2.4.20 \u79fb\u690d\u7ed3\u6784 (sk_buff\/tcp_opt)<\/td>\n<\/tr>\n<tr>\n<td>include\/tcp.h<\/td>\n<td>TCP \u5934\u3001CONNECTION_ENDPOINT \u58f0\u660e<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>2.3 \u5386\u53f2&#xff1a;Linux \u79fb\u690d vs lwIP<\/h4>\n<p>\u6ce8\u610f: ReactOS \u65e9\u671f\u5c06 Linux \u5185\u6838 2.4.20 \u7684 TCP \u5b9e\u73b0\u79fb\u690d\u5230 include\/tcpcore.h<br \/>\n      (\u542b struct sk_buff \/ struct tcp_opt \/ struct sock \u5b8c\u6574\u7ed3\u6784)\u3002<br \/>\n      \u5f53\u524d\u5b9e\u9645\u4f7f\u7528\u7684 TCP \u534f\u8bae\u5b9e\u73b0\u662f lwIP 2.x (\u901a\u8fc7 LibTCP* \u7c98\u5408\u5c42),<br \/>\n      tcpcore.h \u4ecd\u4fdd\u7559\u5728\u5934\u6587\u4ef6\u6811\u4e2d\u4f46\u4e0d\u518d\u662f\u6d3b\u52a8\u5b9e\u73b0\u3002<\/p>\n<hr \/>\n<h3>3. TCP \u62a5\u6587\u683c\u5f0f<\/h3>\n<p>\u5b9a\u4e49\u5728 [tcp.h](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/include\/tcp.h#L15-L25)&#xff1a;<\/p>\n<p><span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">TCPv4_HEADER<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  USHORT SourcePort<span class=\"token punctuation\">;<\/span>        <span class=\"token comment\">\/\/ \u6e90\u7aef\u53e3 (2B)<\/span><br \/>\n  USHORT DestinationPort<span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ \u76ee\u7684\u7aef\u53e3 (2B)<\/span><br \/>\n  ULONG  SequenceNumber<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u5e8f\u53f7 (4B)<\/span><br \/>\n  ULONG  AckNumber<span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/\/ \u786e\u8ba4\u53f7 (4B)<\/span><br \/>\n  UCHAR  DataOffset<span class=\"token punctuation\">;<\/span>        <span class=\"token comment\">\/\/ \u6570\u636e\u504f\u79fb (\u9ad8 4 \u4f4d, \u5355\u4f4d 32 \u4f4d\u5b57)<\/span><br \/>\n  UCHAR  Flags<span class=\"token punctuation\">;<\/span>             <span class=\"token comment\">\/\/ \u6807\u5fd7\u4f4d (\u4f4e 6 \u4f4d)<\/span><br \/>\n  USHORT Window<span class=\"token punctuation\">;<\/span>            <span class=\"token comment\">\/\/ \u63a5\u6536\u7a97\u53e3 (2B)<\/span><br \/>\n  USHORT Checksum<span class=\"token punctuation\">;<\/span>          <span class=\"token comment\">\/\/ \u6821\u9a8c\u548c (2B)<\/span><br \/>\n  USHORT Urgent<span class=\"token punctuation\">;<\/span>            <span class=\"token comment\">\/\/ \u7d27\u6025\u6307\u9488 (2B)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> TCPv4_HEADER<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span>PTCPv4_HEADER<span class=\"token punctuation\">;<\/span><\/p>\n<p> 0                   1                   2                   3<br \/>\n 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1<br \/>\n&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;<br \/>\n|          Source Port          |       Destination Port        |<br \/>\n&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;<br \/>\n|                        Sequence Number                        |<br \/>\n&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;<br \/>\n|                     Acknowledgment Number                     |<br \/>\n&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;<br \/>\n|  Data |       |C|E|U|A|P|R|S|F|                               |<br \/>\n| Offset| Rsvd  |W|C|R|C|S|S|Y|I|            Window             |<br \/>\n|       |       |R|E|G|K|H|T|N|N|                               |<br \/>\n&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;<br \/>\n|           Checksum            |         Urgent Pointer        |<br \/>\n&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;-&#043;<\/p>\n<h4>3.1 \u6807\u5fd7\u4f4d<\/h4>\n<p><span class=\"token comment\">\/* tcpdef.h \u4e2d\u7684 TCP \u6807\u5fd7 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TCP_FIN<\/span>  <span class=\"token expression\"><span class=\"token number\">0x01<\/span>   <\/span><span class=\"token comment\">\/\/ \u7ed3\u675f\u8fde\u63a5<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TCP_SYN<\/span>  <span class=\"token expression\"><span class=\"token number\">0x02<\/span>   <\/span><span class=\"token comment\">\/\/ \u540c\u6b65\u5e8f\u53f7 (\u8fde\u63a5\u5efa\u7acb)<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TCP_RST<\/span>  <span class=\"token expression\"><span class=\"token number\">0x04<\/span>   <\/span><span class=\"token comment\">\/\/ \u91cd\u7f6e\u8fde\u63a5<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TCP_PSH<\/span>  <span class=\"token expression\"><span class=\"token number\">0x08<\/span>   <\/span><span class=\"token comment\">\/\/ \u63a8\u9001\u6570\u636e<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TCP_ACK<\/span>  <span class=\"token expression\"><span class=\"token number\">0x10<\/span>   <\/span><span class=\"token comment\">\/\/ \u786e\u8ba4<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TCP_URG<\/span>  <span class=\"token expression\"><span class=\"token number\">0x20<\/span>   <\/span><span class=\"token comment\">\/\/ \u7d27\u6025<\/span><\/span><\/p>\n<h4>3.2 \u4f2a\u5934 (TCPv4_PSEUDO_HEADER)<\/h4>\n<p>\u5b9a\u4e49\u5728 [tcp.h](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/include\/tcp.h#L38-L44)&#xff1a;<\/p>\n<p><span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">TCPv4_PSEUDO_HEADER<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  ULONG SourceAddress<span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ \u6e90 IP<\/span><br \/>\n  ULONG DestinationAddress<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u76ee\u7684 IP<\/span><br \/>\n  UCHAR Zero<span class=\"token punctuation\">;<\/span>               <span class=\"token comment\">\/\/ \u4fdd\u7559<\/span><br \/>\n  UCHAR Protocol<span class=\"token punctuation\">;<\/span>           <span class=\"token comment\">\/\/ 6 (TCP)<\/span><br \/>\n  USHORT TCPLength<span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/\/ TCP \u6bb5\u957f\u5ea6<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> TCPv4_PSEUDO_HEADER<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span>PTCPv4_PSEUDO_HEADER<span class=\"token punctuation\">;<\/span><\/p>\n<h4>3.3 TCP \u9009\u9879<\/h4>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TCPOPT_END_OF_LIST<\/span>  <span class=\"token expression\"><span class=\"token number\">0x0<\/span>   <\/span><span class=\"token comment\">\/\/ \u9009\u9879\u7ed3\u675f<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TCPOPT_NO_OPERATION<\/span> <span class=\"token expression\"><span class=\"token number\">0x1<\/span>   <\/span><span class=\"token comment\">\/\/ \u65e0\u64cd\u4f5c<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TCPOPT_MAX_SEG_SIZE<\/span> <span class=\"token expression\"><span class=\"token number\">0x2<\/span>   <\/span><span class=\"token comment\">\/\/ \u6700\u5927\u6bb5\u5927\u5c0f (MSS)<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TCPOPTLEN_MAX_SEG_SIZE<\/span>  <span class=\"token expression\"><span class=\"token number\">0x4<\/span><\/span><\/span><\/p>\n<hr \/>\n<h3>4. TCP \u72b6\u6001\u673a<\/h3>\n<p>TCP \u5171\u6709 11 \u79cd\u72b6\u6001&#xff08;lwIP tcp_state_str&#xff09;&#xff1a;<\/p>\n<p>                    &#043;&#8212;&#8212;&#8212;&#043;<br \/>\n                    |  CLOSED |<br \/>\n                    &#043;&#8212;-&#043;&#8212;-&#043;<br \/>\n                         |<br \/>\n                  \u4e3b\u52a8\u6253\u5f00\/\u88ab\u52a8\u6253\u5f00<br \/>\n                         |<br \/>\n                    &#043;&#8212;-v&#8212;-&#043;<br \/>\n                    |  LISTEN |<br \/>\n                    &#043;&#8212;-&#043;&#8212;-&#043;<br \/>\n                         | \u6536\u5230 SYN<br \/>\n                    &#043;&#8212;-v&#8212;-&#043;<br \/>\n                    | SYN_RCVD |<br \/>\n                    &#043;&#8212;-&#043;&#8212;-&#043;<br \/>\n                         | \u53d1\u9001 SYN&#043;ACK<br \/>\n                         |<br \/>\n      \u4e3b\u52a8\u6253\u5f00           |  \u540c\u65f6\u6253\u5f00<br \/>\n    &#043;&#8212;-v&#8212;-&#043;        &#043;&#8212;-v&#8212;-&#043;<br \/>\n    | SYN_SENT&#043;&#8212;&#8212;&#8211;&gt; SYN_RCVD |<br \/>\n    &#043;&#8212;-&#043;&#8212;-&#043;        &#043;&#8212;-&#043;&#8212;-&#043;<br \/>\n         |                  |<br \/>\n         |   \u6536\u5230 SYN&#043;ACK   |   \u6536\u5230 ACK<br \/>\n         &#043;&#8212;&#8212;&#8211;&#043;&#8212;&#8212;&#8211;&#043;<br \/>\n                  |<br \/>\n           &#043;&#8212;&#8212;v&#8212;&#8212;&#043;<br \/>\n           | ESTABLISHED  |<br \/>\n           &#043;&#8212;&#8212;&#043;&#8212;&#8212;&#043;<br \/>\n                  |<br \/>\n     &#043;&#8212;&#8212;&#8212;&#8212;&#043;&#8212;&#8212;&#8212;&#8212;&#043;<br \/>\n     | \u4e3b\u52a8\u5173\u95ed      | \u88ab\u52a8\u5173\u95ed   |<br \/>\n     \u25bc            \u25bc<br \/>\n&#043;&#8212;&#8212;&#8212;&#043;   &#043;&#8212;&#8212;&#8212;&#8211;&#043;<br \/>\n|FIN_WAIT_1|   | CLOSE_WAIT|<br \/>\n&#043;&#8212;-&#043;&#8212;-&#043;   &#043;&#8212;&#8211;&#043;&#8212;&#8211;&#043;<br \/>\n     |              | \u5173\u95ed<br \/>\n&#043;&#8212;-v&#8212;-&#043;   &#043;&#8212;-v&#8212;-&#043;<br \/>\n|FIN_WAIT_2|   | LAST_ACK|<br \/>\n&#043;&#8212;-&#043;&#8212;-&#043;   &#043;&#8212;-&#043;&#8212;-&#043;<br \/>\n     |              |<br \/>\n&#043;&#8212;-v&#8212;-&#043;         |<br \/>\n|TIME_WAIT|         |<br \/>\n&#043;&#8212;-&#043;&#8212;-&#043;         |<br \/>\n     |              |<br \/>\n&#043;&#8212;-v&#8212;-&#043;         |<br \/>\n|  CLOSED |&lt;&#8212;&#8212;&#8211;&#043;<br \/>\n&#043;&#8212;&#8212;&#8212;&#043;<\/p>\n<h4>4.1 \u5173\u952e\u72b6\u6001<\/h4>\n<table>\n<tr>\u72b6\u6001\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>LISTEN<\/td>\n<td>\u76d1\u542c&#xff0c;\u7b49\u5f85 SYN<\/td>\n<\/tr>\n<tr>\n<td>SYN_SENT<\/td>\n<td>\u5df2\u53d1\u9001 SYN&#xff0c;\u7b49\u5f85 SYN&#043;ACK<\/td>\n<\/tr>\n<tr>\n<td>SYN_RCVD<\/td>\n<td>\u5df2\u6536\u5230 SYN&#xff0c;\u5df2\u53d1\u9001 SYN&#043;ACK<\/td>\n<\/tr>\n<tr>\n<td>ESTABLISHED<\/td>\n<td>\u8fde\u63a5\u5efa\u7acb&#xff0c;\u6570\u636e\u4f20\u8f93<\/td>\n<\/tr>\n<tr>\n<td>FIN_WAIT_1\/2<\/td>\n<td>\u4e3b\u52a8\u5173\u95ed\u7b49\u5f85<\/td>\n<\/tr>\n<tr>\n<td>CLOSE_WAIT<\/td>\n<td>\u88ab\u52a8\u5173\u95ed\u7b49\u5f85\u5e94\u7528\u5173\u95ed<\/td>\n<\/tr>\n<tr>\n<td>TIME_WAIT<\/td>\n<td>2MSL \u7b49\u5f85 (60 \u79d2)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>5. \u8fde\u63a5\u7aef\u70b9\u7ed3\u6784 (CONNECTION_ENDPOINT)<\/h3>\n<p>CONNECTION_ENDPOINT \u662f TCP \u5c42\u7684\u6838\u5fc3\u5bf9\u8c61&#xff0c;\u5b9a\u4e49\u5728 [titypes.h](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/include\/titypes.h)\u3002<\/p>\n<h4>5.1 \u7ed3\u6784\u6982\u89c8<\/h4>\n<p>CONNECTION_ENDPOINT<br \/>\n\u2502<br \/>\n\u251c\u2500\u2500 \u5bf9\u8c61\u7ba1\u7406<br \/>\n\u2502   \u251c\u2500\u2500 LONG RefCount              \/\/ \u5f15\u7528\u8ba1\u6570<br \/>\n\u2502   \u251c\u2500\u2500 OBJECT_FREE_ROUTINE Free   \/\/ \u91ca\u653e\u51fd\u6570 (ConnectionFree)<br \/>\n\u2502   \u2514\u2500\u2500 ERESOURCE Resource         \/\/ \u5bf9\u8c61\u9501<br \/>\n\u2502<br \/>\n\u251c\u2500\u2500 \u5730\u5740\u7ed1\u5b9a<br \/>\n\u2502   \u251c\u2500\u2500 PADDRESS_FILE AddressFile  \/\/ \u5173\u8054\u7684\u5730\u5740\u6587\u4ef6<br \/>\n\u2502   \u251c\u2500\u2500 PVOID SocketContext        \/\/ lwIP tcp_pcb \u6307\u9488<br \/>\n\u2502   \u2514\u2500\u2500 PCONNECTION_ENDPOINT Next  \/\/ \u5730\u5740\u6587\u4ef6\u7684\u8fde\u63a5\u94fe\u8868<br \/>\n\u2502<br \/>\n\u251c\u2500\u2500 \u8bf7\u6c42\u961f\u5217 (TDI_BUCKET \u94fe\u8868)<br \/>\n\u2502   \u251c\u2500\u2500 LIST_ENTRY ConnectRequest      \/\/ \u8fde\u63a5\u8bf7\u6c42<br \/>\n\u2502   \u251c\u2500\u2500 LIST_ENTRY ListenRequest       \/\/ \u76d1\u542c\u8bf7\u6c42<br \/>\n\u2502   \u251c\u2500\u2500 LIST_ENTRY AcceptRequest       \/\/ \u63a5\u53d7\u8bf7\u6c42<br \/>\n\u2502   \u251c\u2500\u2500 LIST_ENTRY ReceiveRequest      \/\/ \u63a5\u6536\u8bf7\u6c42<br \/>\n\u2502   \u251c\u2500\u2500 LIST_ENTRY SendRequest         \/\/ \u53d1\u9001\u8bf7\u6c42<br \/>\n\u2502   \u2514\u2500\u2500 LIST_ENTRY ShutdownRequest     \/\/ \u65ad\u5f00\u8bf7\u6c42<br \/>\n\u2502<br \/>\n\u251c\u2500\u2500 \u6570\u636e\u961f\u5217<br \/>\n\u2502   \u251c\u2500\u2500 LIST_ENTRY PacketQueue         \/\/ \u6536\u5230\u7684 pbuf \u961f\u5217 (lwIP)<br \/>\n\u2502   \u251c\u2500\u2500 PLIST_ENTRY SendDataQueue      \/\/ \u5f85\u53d1\u9001\u6570\u636e<br \/>\n\u2502   \u2514\u2500\u2500 PLIST_ENTRY FastSendDataQueue<br \/>\n\u2502<br \/>\n\u2514\u2500\u2500 \u72b6\u6001<br \/>\n    \u251c\u2500\u2500 KEVENT DisconnectEvent<br \/>\n    \u251c\u2500\u2500 KTIMER DisconnectTimer<br \/>\n    \u2514\u2500\u2500 KSPIN_LOCK DisconnectLock<\/p>\n<h4>5.2 TDI_BUCKET \u2014 \u8bf7\u6c42\u6876<\/h4>\n<p>TDI_BUCKET \u5c01\u88c5\u4e86\u4e00\u4e2a\u6302\u8d77\u7684 TDI \u8bf7\u6c42&#xff1a;<\/p>\n<p><span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">_TDI_BUCKET<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    LIST_ENTRY Entry<span class=\"token punctuation\">;<\/span>              <span class=\"token comment\">\/\/ \u961f\u5217\u94fe\u63a5<\/span><br \/>\n    TDI_REQUEST Request<span class=\"token punctuation\">;<\/span>           <span class=\"token comment\">\/\/ TDI \u8bf7\u6c42 (\u53e5\u67c4&#043;\u5b8c\u6210\u56de\u8c03&#043;\u4e0a\u4e0b\u6587)<\/span><br \/>\n    PCONNECTION_ENDPOINT AssociatedEndpoint<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5173\u8054\u7684\u8fde\u63a5\u7aef\u70b9<\/span><br \/>\n    NTSTATUS Status<span class=\"token punctuation\">;<\/span>               <span class=\"token comment\">\/\/ \u5b8c\u6210\u72b6\u6001<\/span><br \/>\n    ULONG_PTR Information<span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/\/ \u4f20\u8f93\u7684\u5b57\u8282\u6570\/\u4fe1\u606f<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> TDI_BUCKET<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span>PTDI_BUCKET<span class=\"token punctuation\">;<\/span><\/p>\n<p>\u4f7f\u7528 TdiBucketLookasideList \u540e\u5907\u5217\u8868\u5206\u914d&#xff1a;<\/p>\n<p><span class=\"token function\">ExInitializeNPagedLookasideList<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>TdiBucketLookasideList<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>TDI_BUCKET<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> TDI_BUCKET_TAG<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>5.3 \u6536\u53d1\u7a97\u53e3 (AFD \u4e2d\u5b9a\u4e49)<\/h4>\n<p>AFD \u5c42\u7ef4\u62a4 FCB-&gt;Send\/Recv \u7a97\u53e3&#xff0c;TCP \u5c42\u901a\u8fc7 TDI \u63a5\u53e3\u4e0e\u4e4b\u4ea4\u4e92\u3002<\/p>\n<hr \/>\n<h3>6. TDI_BUCKET \u4e0e IRP \u961f\u5217\u6a21\u578b<\/h3>\n<h4>6.1 \u8bf7\u6c42\u6302\u8d77\u6a21\u578b<\/h4>\n<p>\u7528\u6237\u6001 IRP (TDI_SEND)<br \/>\n  \u2502<br \/>\n  \u25bc<br \/>\nTCP \u5c42:<br \/>\n  \u251c\u2500 \u5206\u914d TDI_BUCKET<br \/>\n  \u251c\u2500 \u4fdd\u5b58\u5b8c\u6210\u56de\u8c03 (Complete) \u548c\u4e0a\u4e0b\u6587 (Context)<br \/>\n  \u251c\u2500 InsertTailList(&amp;Connection-&gt;SendRequest, &amp;Bucket-&gt;Entry)<br \/>\n  \u2514\u2500 \u8fd4\u56de STATUS_PENDING<br \/>\n  \u2502<br \/>\n  \u25bc (lwIP \u4e8b\u4ef6\u89e6\u53d1\u65f6)<br \/>\n\u4e8b\u4ef6\u5904\u7406\u5668:<br \/>\n  \u251c\u2500 RemoveHeadList(&amp;Connection-&gt;SendRequest)<br \/>\n  \u251c\u2500 \u6267\u884c\u64cd\u4f5c (LibTCPSend)<br \/>\n  \u251c\u2500 Bucket-&gt;Status &#061; \u7ed3\u679c<br \/>\n  \u251c\u2500 Bucket-&gt;Information &#061; \u5b57\u8282\u6570<br \/>\n  \u2514\u2500 CompleteBucket \u2192 BucketCompletionWorker<br \/>\n        \u2514\u2500 \u8c03\u7528 TDI \u5b8c\u6210\u56de\u8c03 \u2192 \u5b8c\u6210\u7528\u6237 IRP<\/p>\n<h4>6.2 CompleteBucket \u2014 \u5b8c\u6210\u8bf7\u6c42<\/h4>\n<p>\u5728 [event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L37-L50)&#xff1a;<\/p>\n<p>CompleteBucket(Connection, Bucket, Synchronous)<br \/>\n   \u251c\u2500 ReferenceObject(Connection)<br \/>\n   \u251c\u2500 Bucket-&gt;AssociatedEndpoint &#061; Connection<br \/>\n   \u251c\u2500 Synchronous \u2192 BucketCompletionWorker \u76f4\u63a5\u6267\u884c<br \/>\n   \u2514\u2500 \u5f02\u6b65 \u2192 ChewCreate(BucketCompletionWorker, Bucket) \u6392\u961f<\/p>\n<h4>6.3 BucketCompletionWorker \u2014 \u5b8c\u6210\u5de5\u4f5c\u9879<\/h4>\n<p>\u5728 [event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L21-L35)&#xff1a;<\/p>\n<p>BucketCompletionWorker(Context)<br \/>\n   \u251c\u2500 Bucket &#061; Context<br \/>\n   \u251c\u2500 Complete &#061; Bucket-&gt;Request.RequestNotifyObject<br \/>\n   \u251c\u2500 Complete(Bucket-&gt;Request.RequestContext, Bucket-&gt;Status, Bucket-&gt;Information)<br \/>\n   \u2502     \u2514\u2500 \u901a\u5e38\u4e3a DispDataRequestComplete \u2192 IoCompleteRequest<br \/>\n   \u251c\u2500 DereferenceObject(Bucket-&gt;AssociatedEndpoint)<br \/>\n   \u2514\u2500 ExFreeToNPagedLookasideList(&amp;TdiBucketLookasideList, Bucket)<\/p>\n<h4>6.4 Flush*Queue \u7cfb\u5217<\/h4>\n<table>\n<tr>\u51fd\u6570\u529f\u80fd<\/tr>\n<tbody>\n<tr>\n<td>FlushReceiveQueue<\/td>\n<td>\u4ee5\u72b6\u6001\u5b8c\u6210\u6240\u6709\u6302\u8d77\u63a5\u6536<\/td>\n<\/tr>\n<tr>\n<td>FlushSendQueue<\/td>\n<td>\u5b8c\u6210\u6240\u6709\u6302\u8d77\u53d1\u9001<\/td>\n<\/tr>\n<tr>\n<td>FlushShutdownQueue<\/td>\n<td>\u5b8c\u6210\u6240\u6709\u6302\u8d77\u65ad\u5f00<\/td>\n<\/tr>\n<tr>\n<td>FlushConnectQueue<\/td>\n<td>\u5b8c\u6210\u6240\u6709\u6302\u8d77\u8fde\u63a5<\/td>\n<\/tr>\n<tr>\n<td>FlushListenQueue<\/td>\n<td>\u5b8c\u6210\u6240\u6709\u6302\u8d77\u76d1\u542c<\/td>\n<\/tr>\n<tr>\n<td>FlushAllQueues<\/td>\n<td>\u5168\u90e8\u5b8c\u6210 (\u8fde\u63a5\u7ec8\u6b62\u65f6)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>7. \u8fde\u63a5\u7ba1\u7406<\/h3>\n<h4>7.1 TCPSocket \u2014 \u521b\u5efa socket<\/h4>\n<p>\u5728 [tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L153)&#xff1a;<\/p>\n<p>TCPSocket(Connection, Family, Type, Proto)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 LockObject(Connection)<br \/>\n   \u251c\u2500 \u8c03\u7528 LibTCPSocket(Connection) \u2192 \u521b\u5efa lwIP tcp_pcb<br \/>\n   \u251c\u2500 \u8bbe\u7f6e\u56de\u8c03:<br \/>\n   \u2502     tcp_arg(pcb, Connection)<br \/>\n   \u2502     tcp_err(pcb, InternalErrorEventHandler)<br \/>\n   \u2502     (\u8fde\u63a5\u5efa\u7acb\u540e\u8bbe\u7f6e tcp_recv\/tcp_sent\/tcp_accept)<br \/>\n   \u251c\u2500 Connection-&gt;SocketContext &#061; pcb<br \/>\n   \u2514\u2500 \u8fd4\u56de<\/p>\n<h4>7.2 TCPConnect \u2014 \u53d1\u8d77\u8fde\u63a5<\/h4>\n<p>\u5728 [tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L301-L424)&#xff1a;<\/p>\n<p>TCPConnect(Connection, ConnInfo, ReturnInfo, Complete, Context)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 LockObject(Connection)<br \/>\n   \u251c\u2500 \u89e3\u6790\u8fdc\u7aef\u5730\u5740 (TA_IP_ADDRESS \u2192 ip_addr_t)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u5206\u914d\u672c\u5730\u7aef\u53e3:<br \/>\n   \u2502     LocalAddress &#061; \u5730\u5740\u6587\u4ef6\u5730\u5740<br \/>\n   \u2502     \u7aef\u53e3\u672a\u6307\u5b9a \u2192 TCPAllocatePort(\u52a8\u6001)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u521b\u5efa TDI_BUCKET \u6302\u5165 ConnectRequest<br \/>\n   \u2502<br \/>\n   \u251c\u2500 LibTCPConnect(Connection, &amp;ipaddr, port)<br \/>\n   \u2502     \u2514\u2500 lwIP: tcp_connect(pcb, ipaddr, port, InternalConnectEventHandler)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u8fd4\u56de STATUS_PENDING<br \/>\n   \u2502<br \/>\n   \u2514\u2500 \u8fde\u63a5\u5b8c\u6210 \u2192 TCPConnectEventHandler<\/p>\n<h4>7.3 LibTCPConnect \u2014 lwIP \u6865\u63a5<\/h4>\n<p>\u5728 [tcp.c \u7c98\u5408\u5c42](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c#L621-L635)&#xff1a;<\/p>\n<p>LibTCPConnect(Connection, ipaddr, port)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u5206\u914d lwip_callback_msg<br \/>\n   \u251c\u2500 \u586b\u5145 Input.Connect { Connection, IpAddress, Port }<br \/>\n   \u251c\u2500 tcpip_callback_with_block(LibTCPConnectCallback, msg, 1)<br \/>\n   \u2502     \u2514\u2500 \u5728 tcpip \u7ebf\u7a0b\u4e2d\u6267\u884c:<br \/>\n   \u2502           tcp_arg(pcb, Connection)<br \/>\n   \u2502           tcp_recv(pcb, InternalRecvEventHandler)<br \/>\n   \u2502           tcp_sent(pcb, InternalSendEventHandler)<br \/>\n   \u2502           tcp_connect(pcb, ipaddr, port, InternalConnectEventHandler)<br \/>\n   \u2502           msg-&gt;Output.Connect.Error &#061; &#8230;<br \/>\n   \u251c\u2500 KeWaitForSingleObject(&amp;msg-&gt;Event)  \/\/ \u7b49\u5f85 tcpip \u7ebf\u7a0b\u5b8c\u6210<br \/>\n   \u2514\u2500 \u8fd4\u56de\u9519\u8bef\u7801<\/p>\n<h4>7.4 TCPConnectEventHandler \u2014 \u8fde\u63a5\u5b8c\u6210<\/h4>\n<p>\u5728 [event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L419-L441)&#xff1a;<\/p>\n<p>TCPConnectEventHandler(arg, err)<br \/>\n   \u251c\u2500 Connection &#061; arg<br \/>\n   \u251c\u2500 \u904d\u5386 ConnectRequest \u961f\u5217:<br \/>\n   \u2502     Bucket-&gt;Status &#061; TCPTranslateError(err)<br \/>\n   \u2502     CompleteBucket(Connection, Bucket, FALSE)<br \/>\n   \u2514\u2500 \u5b8c\u6210\u6240\u6709\u6302\u8d77\u7684\u8fde\u63a5\u8bf7\u6c42<\/p>\n<hr \/>\n<h3>8. \u76d1\u542c\u4e0e\u63a5\u53d7<\/h3>\n<h4>8.1 TCPListen \u2014 \u76d1\u542c<\/h4>\n<p>\u5728 [accept.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/accept.c#L47-L105)&#xff1a;<\/p>\n<p>TCPListen(Connection, Backlog)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u89e3\u6790\u672c\u5730\u7ed1\u5b9a\u5730\u5740:<br \/>\n   \u2502     AddressToBind &#061; AddressFile-&gt;Address<br \/>\n   \u2502     Port &#061; AddressFile-&gt;Port<br \/>\n   \u2502<br \/>\n   \u251c\u2500 LibTCPBind(Connection, &amp;AddressToBind, Port)<br \/>\n   \u2502     \u2514\u2500 tcp_bind(pcb, ipaddr, port)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u7aef\u53e3\u672a\u6307\u5b9a (0):<br \/>\n   \u2502     \u251c\u2500 TCPGetSockAddress \u83b7\u53d6\u5b9e\u9645\u7aef\u53e3<br \/>\n   \u2502     \u251c\u2500 TCPAllocatePort \u5206\u914d\u7aef\u53e3<br \/>\n   \u2502     \u2514\u2500 AddressFile-&gt;Port &#061; AllocatedPort<br \/>\n   \u2502<br \/>\n   \u251c\u2500 Connection-&gt;SocketContext &#061; LibTCPListen(Connection, Backlog)<br \/>\n   \u2502     \u2514\u2500 tcp_listen(pcb) &#043; tcp_accept(pcb, InternalAcceptEventHandler)<br \/>\n   \u2502<br \/>\n   \u2514\u2500 \u8fd4\u56de<\/p>\n<h4>8.2 TCPAccept \u2014 \u63a5\u53d7\u8fde\u63a5<\/h4>\n<p>\u5728 [accept.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/accept.c#L139)&#xff1a;<\/p>\n<p>TCPAccept(Request, Listener, Connection, Complete, Context)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u5206\u914d TDI_BUCKET<br \/>\n   \u251c\u2500 Bucket-&gt;AssociatedEndpoint &#061; Connection (\u63a5\u53d7\u65b0\u8fde\u63a5\u7684 socket)<br \/>\n   \u251c\u2500 \u6302\u5165 Listener-&gt;ListenRequest<br \/>\n   \u2502<br \/>\n   \u2514\u2500 \u8fd4\u56de STATUS_PENDING<br \/>\n         \u2514\u2500 \u65b0\u8fde\u63a5\u5230\u8fbe \u2192 TCPAcceptEventHandler<\/p>\n<h4>8.3 TCPAcceptEventHandler \u2014 \u63a5\u53d7\u5b8c\u6210<\/h4>\n<p>\u5728 [event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L230-L291)&#xff1a;<\/p>\n<p>TCPAcceptEventHandler(arg, newpcb)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 Connection &#061; arg (Listener)<br \/>\n   \u251c\u2500 \u904d\u5386 ListenRequest \u961f\u5217:<br \/>\n   \u2502     \u251c\u2500 TCPCheckPeerForAccept(newpcb, Request):<br \/>\n   \u2502     \u2502     \u2514\u2500 LibTCPGetPeerName \u2192 \u586b\u5145\u8fdc\u7aef\u5730\u5740<br \/>\n   \u2502     \u2502<br \/>\n   \u2502     \u251c\u2500 \u6210\u529f:<br \/>\n   \u2502     \u2502     \u251c\u2500 \u91ca\u653e\u539f socket \u4e0a\u4e0b\u6587 (LibTCPClose \u65e7\u7684 pcb)<br \/>\n   \u2502     \u2502     \u251c\u2500 Bucket-&gt;AssociatedEndpoint-&gt;SocketContext &#061; newpcb<br \/>\n   \u2502     \u2502     \u2514\u2500 LibTCPAccept(newpcb, listen_pcb, AssociatedEndpoint)<br \/>\n   \u2502     \u2502           \u2514\u2500 tcp_recv\/tcp_sent\/tcp_err\/tcp_poll \u8bbe\u7f6e<br \/>\n   \u2502     \u2502           \u2514\u2500 \u901a\u77e5 AFD \u5b8c\u6210 accept<br \/>\n   \u2502     \u2502<br \/>\n   \u2502     \u2514\u2500 CompleteBucket(Connection, Bucket, FALSE)<br \/>\n   \u2502           \u2514\u2500 \u5b8c\u6210\u7528\u6237 IRP<br \/>\n   \u2514\u2500 \u53ea\u63a5\u53d7\u4e00\u4e2a\u8fde\u63a5 (break)<\/p>\n<h4>8.4 TCPAbortListenForSocket \u2014 \u4e2d\u6b62\u76d1\u542c<\/h4>\n<p>\u5728 [accept.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/accept.c#L107-L137)&#xff1a;<\/p>\n<p>TCPAbortListenForSocket(Listener, Connection)<br \/>\n   \u251c\u2500 \u904d\u5386 Listener-&gt;ListenRequest<br \/>\n   \u251c\u2500 \u627e\u5230\u5173\u8054 Connection \u7684 Bucket:<br \/>\n   \u2502     \u251c\u2500 \u79fb\u9664 &#043; \u91ca\u653e<br \/>\n   \u2502     \u2514\u2500 \u8fd4\u56de TRUE<br \/>\n   \u2514\u2500 \u8fd4\u56de FALSE<\/p>\n<hr \/>\n<h3>9. \u6570\u636e\u53d1\u9001\u8def\u5f84<\/h3>\n<h4>9.1 TCPSendData \u2014 \u53d1\u9001\u5165\u53e3<\/h4>\n<p>\u5728 [tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L579-L630)&#xff1a;<\/p>\n<p>TCPSendData(Connection, Buffer, DataSize, DataUsed, Flags, Complete, Context)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u5206\u914d TDI_BUCKET<br \/>\n   \u251c\u2500 Bucket-&gt;Request.RequestNotifyObject &#061; Complete<br \/>\n   \u251c\u2500 Bucket-&gt;Request.RequestContext &#061; Context<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u6302\u5165 Connection-&gt;SendRequest<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u5c1d\u8bd5\u7acb\u5373\u53d1\u9001:<br \/>\n   \u2502     LibTCPSend(Connection, Buffer, DataSize, &amp;sent, TRUE)<br \/>\n   \u2502     \u251c\u2500 \u6210\u529f \u2192 \u5b8c\u6210 Bucket (\u8fd4\u56de\u5df2\u53d1\u9001\u5b57\u8282\u6570)<br \/>\n   \u2502     \u2514\u2500 \u5931\u8d25 (STATUS_PENDING) \u2192 \u4fdd\u6301\u6302\u8d77<br \/>\n   \u2502<br \/>\n   \u2514\u2500 \u8fd4\u56de STATUS_PENDING \/ \u7acb\u5373\u5b8c\u6210<\/p>\n<h4>9.2 LibTCPSend \u2014 lwIP \u53d1\u9001<\/h4>\n<p>\u5728 [tcp.c \u7c98\u5408\u5c42](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c#L556-L590)&#xff1a;<\/p>\n<p>LibTCPSend(Connection, dataptr, len, sent, safe)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u5206\u914d lwip_callback_msg<br \/>\n   \u251c\u2500 tcpip_callback_with_block(LibTCPSendCallback, msg, 1)<br \/>\n   \u2502     \u2514\u2500 tcpip \u7ebf\u7a0b\u4e2d:<br \/>\n   \u2502           Error &#061; tcp_write(pcb, dataptr, len, TCP_WRITE_FLAG_COPY)<br \/>\n   \u2502           \u6210\u529f \u2192 tcp_output(pcb)<br \/>\n   \u2502           msg-&gt;Output.Send.Error &#061; Error<br \/>\n   \u2502           msg-&gt;Output.Send.Information &#061; len<br \/>\n   \u251c\u2500 \u7b49\u5f85\u4e8b\u4ef6<br \/>\n   \u251c\u2500 *sent &#061; Information<br \/>\n   \u2514\u2500 \u8fd4\u56de\u9519\u8bef\u7801<\/p>\n<h4>9.3 TCPSendEventHandler \u2014 \u53d1\u9001\u4e8b\u4ef6<\/h4>\n<p>\u5728 [event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L293-L377)&#xff0c;\u7531 lwIP tcp_sent \u56de\u8c03\u89e6\u53d1&#xff08;\u53d1\u9001\u7a97\u53e3\u6709\u7a7a\u95f4\u65f6&#xff09;&#xff1a;<\/p>\n<p>TCPSendEventHandler(arg, space)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 Connection &#061; arg<br \/>\n   \u251c\u2500 \u904d\u5386 SendRequest \u961f\u5217:<br \/>\n   \u2502     \u251c\u2500 NdisQueryBuffer(Irp-&gt;MdlAddress) \u2192 \u7528\u6237\u53d1\u9001\u7f13\u51b2<br \/>\n   \u2502     \u251c\u2500 LibTCPSend(Connection, SendBuffer, SendLen, &amp;BytesSent, TRUE)<br \/>\n   \u2502     \u251c\u2500 STATUS_PENDING \u2192 \u653e\u56de\u961f\u5217\u5934\u90e8, \u505c\u6b62<br \/>\n   \u2502     \u251c\u2500 \u6210\u529f \u2192 Bucket-&gt;Information &#061; BytesSent<br \/>\n   \u2502     \u2514\u2500 CompleteBucket (\u5b8c\u6210\u7528\u6237 IRP)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u5168\u90e8\u5b8c\u6210\u540e:<br \/>\n   \u2502     \u251c\u2500 FlushShutdownQueue(STATUS_SUCCESS)  \/\/ \u5b8c\u6210\u5f85\u5904\u7406\u7684\u65ad\u5f00<br \/>\n   \u2502     \u2514\u2500 KeCancelTimer(DisconnectTimer)<br \/>\n   \u2502<br \/>\n   \u2514\u2500 DereferenceObject<\/p>\n<hr \/>\n<h3>10. \u6570\u636e\u63a5\u6536\u8def\u5f84<\/h3>\n<h4>10.1 TCPReceive \u2014 IP \u5c42\u5165\u53e3<\/h4>\n<p>\u5728 [tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L192-L206)&#xff0c;\u4f5c\u4e3a IPRegisterProtocol(IPPROTO_TCP, TCPReceive) \u6ce8\u518c&#xff1a;<\/p>\n<p>TCPReceive(Interface, IPPacket)<br \/>\n   \u2502<br \/>\n   \u2514\u2500 LibIPInsertPacket(Interface-&gt;TCPContext, IPPacket-&gt;Header, TotalSize)<br \/>\n         \u2514\u2500 \u5c06 IP \u6570\u636e\u5305\u9001\u5165 lwIP \u7684 netif \u8f93\u5165 (tcpip \u7ebf\u7a0b)<\/p>\n<h4>10.2 LibIPInsertPacket \u2014 \u6ce8\u5165 lwIP<\/h4>\n<p>\u5728 [ip.c \u7c98\u5408\u5c42](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/ip.c)&#xff1a;<\/p>\n<p>LibIPInsertPacket(ifarg, data, size)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u521b\u5efa pbuf (PBUF_RAW, \u5f15\u7528\u6570\u636e)<br \/>\n   \u251c\u2500 \u6392\u961f\u5230 tcpip \u7ebf\u7a0b\u8f93\u5165\u961f\u5217<br \/>\n   \u2502     \u2514\u2500 tcpip_thread \u5904\u7406 \u2192 netif-&gt;input \u2192 tcp_input<br \/>\n   \u2502           \u2514\u2500 lwIP \u5904\u7406 TCP \u6bb5 (\u6821\u9a8c\/\u5e8f\u53f7\/\u72b6\u6001\u673a)<br \/>\n   \u2502                 \u2514\u2500 \u6570\u636e\u5230\u8fbe \u2192 \u8c03\u7528 InternalRecvEventHandler<br \/>\n   \u2514\u2500 \u5b8c\u6210<\/p>\n<h4>10.3 InternalRecvEventHandler \u2192 TCPRecvEventHandler<\/h4>\n<p>lwIP \u6570\u636e\u5230\u8fbe\u65f6\u8c03\u7528\u6ce8\u518c\u7684 tcp_recv \u56de\u8c03&#xff08;\u7c98\u5408\u5c42\u4e2d&#xff09;&#xff1a;<\/p>\n<p>InternalRecvEventHandler(arg, pcb, p, err)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 Connection &#061; arg<br \/>\n   \u251c\u2500 \u5c06 pbuf \u6302\u5165 Connection-&gt;PacketQueue:<br \/>\n   \u2502     LibTCPEnqueuePacket(Connection, p)<br \/>\n   \u2502     tcp_recved(pcb, p-&gt;tot_len)   \/\/ \u901a\u77e5 lwIP \u6570\u636e\u5df2\u53d6\u8d70<br \/>\n   \u2502<br \/>\n   \u2514\u2500 \u8c03\u7528\u5916\u90e8\u5904\u7406\u5668:<br \/>\n         TCPRecvEventHandler(Connection)  \/\/ event.c<\/p>\n<h4>10.4 TCPRecvEventHandler \u2014 \u63a5\u6536\u4e8b\u4ef6<\/h4>\n<p>\u5728 [event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L379-L417)&#xff1a;<\/p>\n<p>TCPRecvEventHandler(arg)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 Connection &#061; arg<br \/>\n   \u251c\u2500 \u904d\u5386 ReceiveRequest \u961f\u5217:<br \/>\n   \u2502     \u251c\u2500 NdisQueryBuffer(Irp-&gt;MdlAddress) \u2192 \u7528\u6237\u63a5\u6536\u7f13\u51b2<br \/>\n   \u2502     \u251c\u2500 LibTCPGetDataFromConnectionQueue(Connection, RecvBuffer,<br \/>\n   \u2502     \u2502                                  RecvLen, &amp;Received)<br \/>\n   \u2502     \u2502     \u2514\u2500 \u4ece PacketQueue \u89e3\u5305 pbuf, \u590d\u5236\u6570\u636e\u5230\u7528\u6237\u7f13\u51b2<br \/>\n   \u2502     \u251c\u2500 STATUS_PENDING \u2192 \u653e\u56de\u961f\u5217\u5934\u90e8, \u505c\u6b62 (\u65e0\u6570\u636e)<br \/>\n   \u2502     \u251c\u2500 \u6210\u529f \u2192 Bucket-&gt;Information &#061; Received<br \/>\n   \u2502     \u2514\u2500 CompleteBucket (\u5b8c\u6210\u7528\u6237 IRP)<br \/>\n   \u2502<br \/>\n   \u2514\u2500 \u5b8c\u6210<\/p>\n<h4>10.5 TCPReceiveData \u2014 TDI \u63a5\u6536\u5165\u53e3<\/h4>\n<p>\u5728 [tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L528-L577)&#xff1a;<\/p>\n<p>TCPReceiveData(Connection, Buffer, ReceiveLength, BytesReceived,<br \/>\n               ReceiveFlags, Complete, Context)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u5206\u914d TDI_BUCKET \u6302\u5165 ReceiveRequest<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u5c1d\u8bd5\u7acb\u5373\u53d6\u6570\u636e:<br \/>\n   \u2502     LibTCPGetDataFromConnectionQueue \u2192 \u6709\u6570\u636e\u5219\u5b8c\u6210<br \/>\n   \u2502     STATUS_PENDING \u2192 \u4fdd\u6301\u6302\u8d77\u7b49\u5f85 TCPRecvEventHandler<br \/>\n   \u2502<br \/>\n   \u2514\u2500 \u8fd4\u56de<\/p>\n<hr \/>\n<h3>11. \u4e8b\u4ef6\u5904\u7406\u5668<\/h3>\n<h4>11.1 \u4e8b\u4ef6\u5904\u7406\u5668\u603b\u89c8<\/h4>\n<p>lwIP \u901a\u8fc7\u56de\u8c03\u9a71\u52a8 TCP \u5c42&#xff0c;\u7c98\u5408\u5c42\u5c06\u56de\u8c03\u8f6c\u53d1\u7ed9 event.c \u7684\u5904\u7406\u5668&#xff1a;<\/p>\n<p>lwIP \u56de\u8c03                   \u7c98\u5408\u5c42                    \u4e8b\u4ef6\u5904\u7406\u5668 (event.c)<br \/>\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500                   \u2500\u2500\u2500\u2500\u2500\u2500                    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<br \/>\ntcp_connect \u5b8c\u6210     \u2192 InternalConnectEventHandler  \u2192 TCPConnectEventHandler<br \/>\ntcp_accept \u65b0\u8fde\u63a5    \u2192 InternalAcceptEventHandler   \u2192 TCPAcceptEventHandler<br \/>\ntcp_recv \u6570\u636e\u5230\u8fbe    \u2192 InternalRecvEventHandler     \u2192 TCPRecvEventHandler<br \/>\ntcp_sent \u53ef\u53d1\u9001      \u2192 InternalSendEventHandler     \u2192 TCPSendEventHandler<br \/>\ntcp_err \u9519\u8bef\/\u5173\u95ed    \u2192 InternalErrorEventHandler    \u2192 TCPFinEventHandler<br \/>\ntcp_poll \u5468\u671f\u8f6e\u8be2    \u2192 InternalPollEventHandler     \u2192 (keepalive\/\u8d85\u65f6)<\/p>\n<h4>11.2 TCPFinEventHandler \u2014 \u8fde\u63a5\u7ec8\u6b62<\/h4>\n<p>\u5728 [event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L181-L228)&#xff1a;<\/p>\n<p>TCPFinEventHandler(arg, err)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 Status &#061; TCPTranslateError(err)<br \/>\n   \u251c\u2500 FlushAllQueues(Connection, Status)   \/\/ \u5b8c\u6210\u6240\u6709\u6302\u8d77\u8bf7\u6c42<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u4ece\u5730\u5740\u6587\u4ef6\u8fde\u63a5\u94fe\u8868\u79fb\u9664:<br \/>\n   \u2502     \u251c\u2500 \u662f\u9996\u8fde\u63a5 \u2192 AddressFile-&gt;Connection &#061; Next<br \/>\n   \u2502     \u251c\u2500 \u662f\u76d1\u542c\u5668 \u2192 AddressFile-&gt;Listener &#061; NULL<br \/>\n   \u2502     \u2514\u2500 \u904d\u5386\u67e5\u627e \u2192 \u4ece\u94fe\u4e2d\u79fb\u9664<br \/>\n   \u2502<br \/>\n   \u251c\u2500 DereferenceObject(AddressFile)<br \/>\n   \u251c\u2500 Connection-&gt;AddressFile &#061; NULL<br \/>\n   \u2514\u2500 \u5b8c\u6210<\/p>\n<h4>11.3 TCPTranslateError \u2014 \u9519\u8bef\u7801\u8f6c\u6362<\/h4>\n<p>\u5728 [tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L267-L299)&#xff0c;\u5c06 lwIP err_t \u8f6c\u6362\u4e3a NTSTATUS&#xff1a;<\/p>\n<p>err_t          \u2192  NTSTATUS<br \/>\nERR_OK (0)     \u2192  STATUS_SUCCESS<br \/>\nERR_MEM (-1)   \u2192  STATUS_INSUFFICIENT_RESOURCES<br \/>\nERR_BUF (-2)   \u2192  STATUS_BUFFER_TOO_SMALL<br \/>\nERR_TIMEOUT(-3)\u2192  STATUS_TIMEOUT<br \/>\nERR_RTE (-4)   \u2192  STATUS_NETWORK_UNREACHABLE<br \/>\nERR_INPROGRESS\u2192  STATUS_PENDING<br \/>\nERR_VAL (-6)   \u2192  STATUS_INVALID_PARAMETER<br \/>\nERR_WOULDBLOCK\u2192  STATUS_CANT_WAIT<br \/>\nERR_USE (-8)   \u2192  STATUS_ADDRESS_ALREADY_EXISTS<br \/>\nERR_ABRT (-10) \u2192  STATUS_LOCAL_DISCONNECT<br \/>\nERR_RST (-11)  \u2192  STATUS_REMOTE_DISCONNECT<br \/>\nERR_CLSD (-12) \u2192  STATUS_FILE_CLOSED<br \/>\nERR_CONN (-13) \u2192  STATUS_INVALID_CONNECTION<br \/>\nERR_IF (-15)   \u2192  STATUS_UNEXPECTED_NETWORK_ERROR<\/p>\n<hr \/>\n<h3>12. lwIP \u7c98\u5408\u5c42\u4e0e tcpip \u7ebf\u7a0b\u6a21\u578b<\/h3>\n<h4>12.1 \u7ebf\u7a0b\u6a21\u578b<\/h4>\n<p>lwIP \u8981\u6c42\u6240\u6709 raw API \u8c03\u7528\u5728 tcpip \u7ebf\u7a0b \u4e2d\u6267\u884c&#xff1a;<\/p>\n<p>LibTCPXxx (\u8c03\u7528\u7ebf\u7a0b)<br \/>\n  \u2502<br \/>\n  \u2502 1. \u5206\u914d lwip_callback_msg { Event, Input, Output }<br \/>\n  \u2502 2. \u586b\u5145 Input \u53c2\u6570<br \/>\n  \u2502 3. tcpip_callback_with_block(LibTCPXxxCallback, msg, 1)<br \/>\n  \u2502       \u2502<br \/>\n  \u2502       \u25bc (\u6392\u961f\u5230 tcpip \u7ebf\u7a0b)<br \/>\n  \u2502     tcpip \u7ebf\u7a0b: LibTCPXxxCallback(msg)<br \/>\n  \u2502       \u251c\u2500 \u8c03\u7528 lwIP raw API (tcp_connect\/tcp_write\/&#8230;)<br \/>\n  \u2502       \u251c\u2500 \u586b\u5145 msg-&gt;Output<br \/>\n  \u2502       \u2514\u2500 KeSetEvent(&amp;msg-&gt;Event)<br \/>\n  \u2502<br \/>\n  \u2502 4. KeWaitForSingleObject(&amp;msg-&gt;Event)   \/\/ \u7b49\u5f85\u5b8c\u6210<br \/>\n  \u2502 5. \u8bfb\u53d6 Output<br \/>\n  \u2502<br \/>\n  \u2514\u2500 \u8fd4\u56de\u7ed3\u679c<\/p>\n<h4>12.2 lwip_callback_msg<\/h4>\n<p>\u5b9a\u4e49\u5728 [lwip_glue.h](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/lwip_glue.h#L24-L92)&#xff1a;<\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">lwip_callback_msg<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    KEVENT Event<span class=\"token punctuation\">;<\/span>                <span class=\"token comment\">\/\/ \u540c\u6b65\u4e8b\u4ef6<\/span><\/p>\n<p>    <span class=\"token keyword\">union<\/span> <span class=\"token punctuation\">{<\/span>                      <span class=\"token comment\">\/\/ \u8f93\u5165\u53c2\u6570<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> PVOID Arg<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Socket<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">tcp_pcb<\/span><span class=\"token operator\">*<\/span> pcb<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> FreeSocket<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> PCONNECTION_ENDPOINT Connection<span class=\"token punctuation\">;<\/span> <span class=\"token class-name\">ip_addr_t<\/span> <span class=\"token operator\">*<\/span>IpAddress<span class=\"token punctuation\">;<\/span> <span class=\"token class-name\">u16_t<\/span> Port<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Bind<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> PCONNECTION_ENDPOINT Connection<span class=\"token punctuation\">;<\/span> <span class=\"token class-name\">u8_t<\/span> Backlog<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Listen<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> PCONNECTION_ENDPOINT Connection<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>Data<span class=\"token punctuation\">;<\/span> <span class=\"token class-name\">u16_t<\/span> DataLength<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Send<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> PCONNECTION_ENDPOINT Connection<span class=\"token punctuation\">;<\/span> <span class=\"token class-name\">ip_addr_t<\/span> <span class=\"token operator\">*<\/span>IpAddress<span class=\"token punctuation\">;<\/span> <span class=\"token class-name\">u16_t<\/span> Port<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Connect<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> PCONNECTION_ENDPOINT Connection<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">int<\/span> shut_rx<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">int<\/span> shut_tx<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Shutdown<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> PCONNECTION_ENDPOINT Connection<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">int<\/span> Callback<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Close<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> Input<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">union<\/span> <span class=\"token punctuation\">{<\/span>                      <span class=\"token comment\">\/\/ \u8f93\u51fa\u7ed3\u679c<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">tcp_pcb<\/span> <span class=\"token operator\">*<\/span>NewPcb<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Socket<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token class-name\">err_t<\/span> Error<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Bind<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">tcp_pcb<\/span> <span class=\"token operator\">*<\/span>NewPcb<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Listen<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token class-name\">err_t<\/span> Error<span class=\"token punctuation\">;<\/span> <span class=\"token class-name\">u32_t<\/span> Information<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Send<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token class-name\">err_t<\/span> Error<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Connect<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token class-name\">err_t<\/span> Error<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Shutdown<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token class-name\">err_t<\/span> Error<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> Close<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> Output<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>12.3 LibTCP* \u51fd\u6570\u6e05\u5355<\/h4>\n<table>\n<tr>\u51fd\u6570lwIP \u8c03\u7528\u529f\u80fd<\/tr>\n<tbody>\n<tr>\n<td>LibTCPSocket<\/td>\n<td>tcp_new<\/td>\n<td>\u521b\u5efa PCB<\/td>\n<\/tr>\n<tr>\n<td>LibTCPFreeSocket<\/td>\n<td>tcp_close<\/td>\n<td>\u5173\u95ed PCB<\/td>\n<\/tr>\n<tr>\n<td>LibTCPBind<\/td>\n<td>tcp_bind<\/td>\n<td>\u7ed1\u5b9a\u672c\u5730\u5730\u5740\u7aef\u53e3<\/td>\n<\/tr>\n<tr>\n<td>LibTCPListen<\/td>\n<td>tcp_listen &#043; tcp_accept<\/td>\n<td>\u8fdb\u5165\u76d1\u542c<\/td>\n<\/tr>\n<tr>\n<td>LibTCPSend<\/td>\n<td>tcp_write &#043; tcp_output<\/td>\n<td>\u53d1\u9001\u6570\u636e<\/td>\n<\/tr>\n<tr>\n<td>LibTCPConnect<\/td>\n<td>tcp_connect<\/td>\n<td>\u53d1\u8d77\u8fde\u63a5<\/td>\n<\/tr>\n<tr>\n<td>LibTCPShutdown<\/td>\n<td>tcp_shutdown<\/td>\n<td>\u5173\u95ed\u8bfb\u5199<\/td>\n<\/tr>\n<tr>\n<td>LibTCPClose<\/td>\n<td>tcp_close<\/td>\n<td>\u5173\u95ed<\/td>\n<\/tr>\n<tr>\n<td>LibTCPGetPeerName<\/td>\n<td>\u8bfb PCB \u5b57\u6bb5<\/td>\n<td>\u83b7\u53d6\u8fdc\u7aef\u5730\u5740<\/td>\n<\/tr>\n<tr>\n<td>LibTCPGetHostName<\/td>\n<td>\u8bfb PCB \u5b57\u6bb5<\/td>\n<td>\u83b7\u53d6\u672c\u5730\u5730\u5740<\/td>\n<\/tr>\n<tr>\n<td>LibTCPAccept<\/td>\n<td>\u8bbe\u7f6e\u56de\u8c03<\/td>\n<td>\u8bbe\u7f6e\u65b0 PCB \u56de\u8c03<\/td>\n<\/tr>\n<tr>\n<td>LibTCPSetNoDelay<\/td>\n<td>tcp_nagle_disable<\/td>\n<td>\u7981\u7528 Nagle<\/td>\n<\/tr>\n<tr>\n<td>LibTCPGetSocketStatus<\/td>\n<td>\u8bfb state<\/td>\n<td>\u83b7\u53d6\u72b6\u6001<\/td>\n<\/tr>\n<tr>\n<td>LibTCPEnqueuePacket<\/td>\n<td>pbuf \u7ba1\u7406<\/td>\n<td>\u5165\u961f\u63a5\u6536\u6570\u636e<\/td>\n<\/tr>\n<tr>\n<td>LibTCPGetDataFromConnectionQueue<\/td>\n<td>pbuf \u8bfb\u53d6<\/td>\n<td>\u51fa\u961f\u590d\u5236\u6570\u636e<\/td>\n<\/tr>\n<tr>\n<td>LibIPInsertPacket<\/td>\n<td>netif input<\/td>\n<td>\u6ce8\u5165 IP \u5305<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>13. \u65ad\u5f00\u4e0e\u6e05\u7406<\/h3>\n<h4>13.1 TCPDisconnect \u2014 TDI \u65ad\u5f00<\/h4>\n<p>\u5728 [tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L426-L526)&#xff1a;<\/p>\n<p>TCPDisconnect(Connection, Flags, Timeout, ConnInfo, ReturnInfo, Complete, Context)<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u89e3\u6790 Flags:<br \/>\n   \u2502     TDI_DISCONNECT_ABORT:<br \/>\n   \u2502     \u2502     \u2514\u2500 LibTCPShutdown(Connection, 1, 1)  \/\/ \u7acb\u5373\u4e2d\u6b62 (RST)<br \/>\n   \u2502     \u2502<br \/>\n   \u2502     TDI_DISCONNECT_RELEASE:<br \/>\n   \u2502     \u2502     \u2514\u2500 LibTCPShutdown(Connection, 0, 1)  \/\/ \u53ea\u5173\u53d1\u9001 (FIN)<br \/>\n   \u2502     \u2502<br \/>\n   \u2502     \u5176\u4ed6 (\u6b63\u5e38):<br \/>\n   \u2502           \u2514\u2500 LibTCPShutdown(Connection, 0, 1)<br \/>\n   \u2502                 \u2514\u2500 \u6302\u8d77 ShutdownRequest \u76f4\u5230\u53d1\u9001\u5b8c\u6210<br \/>\n   \u2502<br \/>\n   \u251c\u2500 \u8bbe\u7f6e DisconnectTimer (\u8d85\u65f6\u5f3a\u5236\u5b8c\u6210)<br \/>\n   \u2502<br \/>\n   \u2514\u2500 \u5b8c\u6210\u6216\u6302\u8d77<\/p>\n<h4>13.2 TCPClose \u2014 \u5173\u95ed<\/h4>\n<p>\u5728 [tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L177-L190)&#xff1a;<\/p>\n<p>TCPClose(Connection)<br \/>\n   \u2514\u2500 LibTCPClose(Connection, FALSE, TRUE)<br \/>\n         \u2514\u2500 tcp_close(pcb) \u2192 lwIP \u53d1\u9001 FIN\/\u91ca\u653e<\/p>\n<h4>13.3 \u8fde\u63a5\u8d44\u6e90\u91ca\u653e (ConnectionFree)<\/h4>\n<p>ConnectionFree(Object)<br \/>\n   \u251c\u2500 Connection &#061; Object<br \/>\n   \u251c\u2500 \u6e05\u7406 PacketQueue (\u91ca\u653e pbuf)<br \/>\n   \u251c\u2500 LibTCPFreeSocket(SocketContext)   \/\/ \u5173\u95ed lwIP PCB<br \/>\n   \u2514\u2500 ExFreePool(Connection)<\/p>\n<hr \/>\n<h3>14. \u5de5\u4f5c\u6d41\u7a0b\u56fe<\/h3>\n<h4>14.1 TCP \u8fde\u63a5\u5efa\u7acb (\u4e09\u6b21\u63e1\u624b)<\/h4>\n<p>     \u8fdc\u7aef<\/p>\n<p>     lwIP tcpip\u7ebf\u7a0b<\/p>\n<p>     TCP\u5c42(tcpip.sys)<\/p>\n<p>     \u5e94\u7528\u7a0b\u5e8f<\/p>\n<p>      \u8fdc\u7aef<\/p>\n<p>      lwIP tcpip\u7ebf\u7a0b<\/p>\n<p>      TCP\u5c42(tcpip.sys)<\/p>\n<p>      \u5e94\u7528\u7a0b\u5e8f<\/p>\n<p>  #mermaid-svg-rexOxnyITE46znnG{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rexOxnyITE46znnG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rexOxnyITE46znnG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rexOxnyITE46znnG .error-icon{fill:#552222;}#mermaid-svg-rexOxnyITE46znnG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rexOxnyITE46znnG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rexOxnyITE46znnG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rexOxnyITE46znnG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rexOxnyITE46znnG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rexOxnyITE46znnG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rexOxnyITE46znnG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rexOxnyITE46znnG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rexOxnyITE46znnG .marker.cross{stroke:#333333;}#mermaid-svg-rexOxnyITE46znnG svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rexOxnyITE46znnG p{margin:0;}#mermaid-svg-rexOxnyITE46znnG .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-rexOxnyITE46znnG text.actor&gt;tspan{fill:black;stroke:none;}#mermaid-svg-rexOxnyITE46znnG .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-rexOxnyITE46znnG .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-rexOxnyITE46znnG .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-rexOxnyITE46znnG .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-rexOxnyITE46znnG #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-rexOxnyITE46znnG .sequenceNumber{fill:white;}#mermaid-svg-rexOxnyITE46znnG #sequencenumber{fill:#333;}#mermaid-svg-rexOxnyITE46znnG #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-rexOxnyITE46znnG .messageText{fill:#333;stroke:none;}#mermaid-svg-rexOxnyITE46znnG .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-rexOxnyITE46znnG .labelText,#mermaid-svg-rexOxnyITE46znnG .labelText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-rexOxnyITE46znnG .loopText,#mermaid-svg-rexOxnyITE46znnG .loopText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-rexOxnyITE46znnG .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-rexOxnyITE46znnG .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-rexOxnyITE46znnG .noteText,#mermaid-svg-rexOxnyITE46znnG .noteText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-rexOxnyITE46znnG .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-rexOxnyITE46znnG .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-rexOxnyITE46znnG .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-rexOxnyITE46znnG .actorPopupMenu{position:absolute;}#mermaid-svg-rexOxnyITE46znnG .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 \/ 0.4));}#mermaid-svg-rexOxnyITE46znnG .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-rexOxnyITE46znnG .actor-man circle,#mermaid-svg-rexOxnyITE46znnG line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-rexOxnyITE46znnG :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<\/p>\n<p>     \u7b2c\u4e00\u6b21\u63e1\u624b<\/p>\n<p>   connect() (TDI_CONNECT)<\/p>\n<p>   \u5206\u914d\u672c\u5730\u7aef\u53e3 &#043; \u521b\u5efa TDI_BUCKET<\/p>\n<p>   LibTCPConnect (\u6392\u961f\u5230 tcpip \u7ebf\u7a0b)<\/p>\n<p>   \u53d1\u9001 SYN (tcp_connect)<\/p>\n<p>   \u6536\u5230 SYN&#043;ACK<\/p>\n<p>   \u53d1\u9001 ACK (\u7b2c\u4e8c\u6b21\/\u7b2c\u4e09\u6b21\u63e1\u624b)<\/p>\n<p>   InternalConnectEventHandler (err&#061;ERR_OK)<\/p>\n<p>   TCPConnectEventHandler \u5b8c\u6210\u6240\u6709\u8fde\u63a5\u8bf7\u6c42<\/p>\n<p>   \u8fde\u63a5\u6210\u529f (IoCompleteRequest)<\/p>\n<h4>14.2 TCP \u6570\u636e\u53d1\u9001\u6d41\u7a0b<\/h4>\n<p>  #mermaid-svg-8ganwPQbVs6NqoPE{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8ganwPQbVs6NqoPE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8ganwPQbVs6NqoPE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8ganwPQbVs6NqoPE .error-icon{fill:#552222;}#mermaid-svg-8ganwPQbVs6NqoPE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8ganwPQbVs6NqoPE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8ganwPQbVs6NqoPE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8ganwPQbVs6NqoPE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8ganwPQbVs6NqoPE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8ganwPQbVs6NqoPE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8ganwPQbVs6NqoPE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8ganwPQbVs6NqoPE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8ganwPQbVs6NqoPE .marker.cross{stroke:#333333;}#mermaid-svg-8ganwPQbVs6NqoPE svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8ganwPQbVs6NqoPE p{margin:0;}#mermaid-svg-8ganwPQbVs6NqoPE .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-8ganwPQbVs6NqoPE .cluster-label text{fill:#333;}#mermaid-svg-8ganwPQbVs6NqoPE .cluster-label span{color:#333;}#mermaid-svg-8ganwPQbVs6NqoPE .cluster-label span p{background-color:transparent;}#mermaid-svg-8ganwPQbVs6NqoPE .label text,#mermaid-svg-8ganwPQbVs6NqoPE span{fill:#333;color:#333;}#mermaid-svg-8ganwPQbVs6NqoPE .node rect,#mermaid-svg-8ganwPQbVs6NqoPE .node circle,#mermaid-svg-8ganwPQbVs6NqoPE .node ellipse,#mermaid-svg-8ganwPQbVs6NqoPE .node polygon,#mermaid-svg-8ganwPQbVs6NqoPE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8ganwPQbVs6NqoPE .rough-node .label text,#mermaid-svg-8ganwPQbVs6NqoPE .node .label text,#mermaid-svg-8ganwPQbVs6NqoPE .image-shape .label,#mermaid-svg-8ganwPQbVs6NqoPE .icon-shape .label{text-anchor:middle;}#mermaid-svg-8ganwPQbVs6NqoPE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8ganwPQbVs6NqoPE .rough-node .label,#mermaid-svg-8ganwPQbVs6NqoPE .node .label,#mermaid-svg-8ganwPQbVs6NqoPE .image-shape .label,#mermaid-svg-8ganwPQbVs6NqoPE .icon-shape .label{text-align:center;}#mermaid-svg-8ganwPQbVs6NqoPE .node.clickable{cursor:pointer;}#mermaid-svg-8ganwPQbVs6NqoPE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8ganwPQbVs6NqoPE .arrowheadPath{fill:#333333;}#mermaid-svg-8ganwPQbVs6NqoPE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8ganwPQbVs6NqoPE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8ganwPQbVs6NqoPE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8ganwPQbVs6NqoPE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8ganwPQbVs6NqoPE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8ganwPQbVs6NqoPE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8ganwPQbVs6NqoPE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8ganwPQbVs6NqoPE .cluster text{fill:#333;}#mermaid-svg-8ganwPQbVs6NqoPE .cluster span{color:#333;}#mermaid-svg-8ganwPQbVs6NqoPE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8ganwPQbVs6NqoPE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8ganwPQbVs6NqoPE rect.text{fill:none;stroke-width:0;}#mermaid-svg-8ganwPQbVs6NqoPE .icon-shape,#mermaid-svg-8ganwPQbVs6NqoPE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8ganwPQbVs6NqoPE .icon-shape p,#mermaid-svg-8ganwPQbVs6NqoPE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8ganwPQbVs6NqoPE .icon-shape .label rect,#mermaid-svg-8ganwPQbVs6NqoPE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8ganwPQbVs6NqoPE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8ganwPQbVs6NqoPE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8ganwPQbVs6NqoPE :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u5e94\u7528 send<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>TDI_SEND \u2192 TCPSendData<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u5206\u914d TDI_BUCKET<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u6302\u5165 SendRequest \u961f\u5217<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>LibTCPSend<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u6392\u961f tcpip_callback<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>tcpip \u7ebf\u7a0b: tcp_write &#043; tcp_output<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u53d1\u9001\u7a97\u53e3\u6709\u7a7a\u95f4?<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u6784\u9020 TCP \u6bb5 \u2192 IP \u5c42\u53d1\u9001<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u7b49\u5f85 tcp_sent \u4e8b\u4ef6<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>tcp_sent \u56de\u8c03 \u2192 InternalSendEventHandler<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>TCPSendEventHandler<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u4ece SendRequest \u53d6 Bucket<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>LibTCPSend \u53d1\u9001\u4e0b\u4e00\u6279<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>CompleteBucket \u5b8c\u6210\u7528\u6237 IRP<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u5e94\u7528 send \u8fd4\u56de<\/p>\n<p><\/span><\/p>\n<h4>14.3 TCP \u6570\u636e\u63a5\u6536\u6d41\u7a0b<\/h4>\n<p>  #mermaid-svg-ptEeDvx6XZn7ApUY{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ptEeDvx6XZn7ApUY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ptEeDvx6XZn7ApUY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ptEeDvx6XZn7ApUY .error-icon{fill:#552222;}#mermaid-svg-ptEeDvx6XZn7ApUY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ptEeDvx6XZn7ApUY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ptEeDvx6XZn7ApUY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ptEeDvx6XZn7ApUY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ptEeDvx6XZn7ApUY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ptEeDvx6XZn7ApUY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ptEeDvx6XZn7ApUY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ptEeDvx6XZn7ApUY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ptEeDvx6XZn7ApUY .marker.cross{stroke:#333333;}#mermaid-svg-ptEeDvx6XZn7ApUY svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ptEeDvx6XZn7ApUY p{margin:0;}#mermaid-svg-ptEeDvx6XZn7ApUY .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ptEeDvx6XZn7ApUY .cluster-label text{fill:#333;}#mermaid-svg-ptEeDvx6XZn7ApUY .cluster-label span{color:#333;}#mermaid-svg-ptEeDvx6XZn7ApUY .cluster-label span p{background-color:transparent;}#mermaid-svg-ptEeDvx6XZn7ApUY .label text,#mermaid-svg-ptEeDvx6XZn7ApUY span{fill:#333;color:#333;}#mermaid-svg-ptEeDvx6XZn7ApUY .node rect,#mermaid-svg-ptEeDvx6XZn7ApUY .node circle,#mermaid-svg-ptEeDvx6XZn7ApUY .node ellipse,#mermaid-svg-ptEeDvx6XZn7ApUY .node polygon,#mermaid-svg-ptEeDvx6XZn7ApUY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ptEeDvx6XZn7ApUY .rough-node .label text,#mermaid-svg-ptEeDvx6XZn7ApUY .node .label text,#mermaid-svg-ptEeDvx6XZn7ApUY .image-shape .label,#mermaid-svg-ptEeDvx6XZn7ApUY .icon-shape .label{text-anchor:middle;}#mermaid-svg-ptEeDvx6XZn7ApUY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ptEeDvx6XZn7ApUY .rough-node .label,#mermaid-svg-ptEeDvx6XZn7ApUY .node .label,#mermaid-svg-ptEeDvx6XZn7ApUY .image-shape .label,#mermaid-svg-ptEeDvx6XZn7ApUY .icon-shape .label{text-align:center;}#mermaid-svg-ptEeDvx6XZn7ApUY .node.clickable{cursor:pointer;}#mermaid-svg-ptEeDvx6XZn7ApUY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ptEeDvx6XZn7ApUY .arrowheadPath{fill:#333333;}#mermaid-svg-ptEeDvx6XZn7ApUY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ptEeDvx6XZn7ApUY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ptEeDvx6XZn7ApUY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ptEeDvx6XZn7ApUY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ptEeDvx6XZn7ApUY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ptEeDvx6XZn7ApUY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ptEeDvx6XZn7ApUY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ptEeDvx6XZn7ApUY .cluster text{fill:#333;}#mermaid-svg-ptEeDvx6XZn7ApUY .cluster span{color:#333;}#mermaid-svg-ptEeDvx6XZn7ApUY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ptEeDvx6XZn7ApUY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ptEeDvx6XZn7ApUY rect.text{fill:none;stroke-width:0;}#mermaid-svg-ptEeDvx6XZn7ApUY .icon-shape,#mermaid-svg-ptEeDvx6XZn7ApUY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ptEeDvx6XZn7ApUY .icon-shape p,#mermaid-svg-ptEeDvx6XZn7ApUY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ptEeDvx6XZn7ApUY .icon-shape .label rect,#mermaid-svg-ptEeDvx6XZn7ApUY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ptEeDvx6XZn7ApUY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ptEeDvx6XZn7ApUY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ptEeDvx6XZn7ApUY :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>IP \u5c42 \u2192 TCPReceive<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>LibIPInsertPacket<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u521b\u5efa pbuf \u6ce8\u5165 netif<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>tcpip \u7ebf\u7a0b: tcp_input<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>lwIP \u6821\u9a8c\/\u5e8f\u53f7\u5904\u7406<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>tcp_recv \u56de\u8c03<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>InternalRecvEventHandler<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>LibTCPEnqueuePacket \u6302\u5165 PacketQueue<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>tcp_recved \u901a\u77e5 lwIP<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>TCPRecvEventHandler<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u6709\u6302\u8d77\u7684 ReceiveRequest?<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>LibTCPGetDataFromConnectionQueue<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u590d\u5236\u6570\u636e\u5230\u7528\u6237 MDL \u7f13\u51b2<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>CompleteBucket \u5b8c\u6210 IRP<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u5e94\u7528 recv \u8fd4\u56de<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u6570\u636e\u7559\u5728\u961f\u5217\u7b49\u5f85<\/p>\n<p><\/span><\/p>\n<h4>14.4 \u76d1\u542c\u4e0e\u63a5\u53d7\u6d41\u7a0b<\/h4>\n<p>  #mermaid-svg-Pf82DBbYmNKxP41n{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Pf82DBbYmNKxP41n .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Pf82DBbYmNKxP41n .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Pf82DBbYmNKxP41n .error-icon{fill:#552222;}#mermaid-svg-Pf82DBbYmNKxP41n .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Pf82DBbYmNKxP41n .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Pf82DBbYmNKxP41n .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Pf82DBbYmNKxP41n .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Pf82DBbYmNKxP41n .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Pf82DBbYmNKxP41n .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Pf82DBbYmNKxP41n .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Pf82DBbYmNKxP41n .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Pf82DBbYmNKxP41n .marker.cross{stroke:#333333;}#mermaid-svg-Pf82DBbYmNKxP41n svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Pf82DBbYmNKxP41n p{margin:0;}#mermaid-svg-Pf82DBbYmNKxP41n .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Pf82DBbYmNKxP41n .cluster-label text{fill:#333;}#mermaid-svg-Pf82DBbYmNKxP41n .cluster-label span{color:#333;}#mermaid-svg-Pf82DBbYmNKxP41n .cluster-label span p{background-color:transparent;}#mermaid-svg-Pf82DBbYmNKxP41n .label text,#mermaid-svg-Pf82DBbYmNKxP41n span{fill:#333;color:#333;}#mermaid-svg-Pf82DBbYmNKxP41n .node rect,#mermaid-svg-Pf82DBbYmNKxP41n .node circle,#mermaid-svg-Pf82DBbYmNKxP41n .node ellipse,#mermaid-svg-Pf82DBbYmNKxP41n .node polygon,#mermaid-svg-Pf82DBbYmNKxP41n .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Pf82DBbYmNKxP41n .rough-node .label text,#mermaid-svg-Pf82DBbYmNKxP41n .node .label text,#mermaid-svg-Pf82DBbYmNKxP41n .image-shape .label,#mermaid-svg-Pf82DBbYmNKxP41n .icon-shape .label{text-anchor:middle;}#mermaid-svg-Pf82DBbYmNKxP41n .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Pf82DBbYmNKxP41n .rough-node .label,#mermaid-svg-Pf82DBbYmNKxP41n .node .label,#mermaid-svg-Pf82DBbYmNKxP41n .image-shape .label,#mermaid-svg-Pf82DBbYmNKxP41n .icon-shape .label{text-align:center;}#mermaid-svg-Pf82DBbYmNKxP41n .node.clickable{cursor:pointer;}#mermaid-svg-Pf82DBbYmNKxP41n .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Pf82DBbYmNKxP41n .arrowheadPath{fill:#333333;}#mermaid-svg-Pf82DBbYmNKxP41n .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Pf82DBbYmNKxP41n .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Pf82DBbYmNKxP41n .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Pf82DBbYmNKxP41n .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Pf82DBbYmNKxP41n .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Pf82DBbYmNKxP41n .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Pf82DBbYmNKxP41n .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Pf82DBbYmNKxP41n .cluster text{fill:#333;}#mermaid-svg-Pf82DBbYmNKxP41n .cluster span{color:#333;}#mermaid-svg-Pf82DBbYmNKxP41n div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Pf82DBbYmNKxP41n .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Pf82DBbYmNKxP41n rect.text{fill:none;stroke-width:0;}#mermaid-svg-Pf82DBbYmNKxP41n .icon-shape,#mermaid-svg-Pf82DBbYmNKxP41n .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Pf82DBbYmNKxP41n .icon-shape p,#mermaid-svg-Pf82DBbYmNKxP41n .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Pf82DBbYmNKxP41n .icon-shape .label rect,#mermaid-svg-Pf82DBbYmNKxP41n .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Pf82DBbYmNKxP41n .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Pf82DBbYmNKxP41n .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Pf82DBbYmNKxP41n :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u5e94\u7528 listen<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>TDI_LISTEN \u2192 TCPListen<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>LibTCPBind \u7ed1\u5b9a\u5730\u5740<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>LibTCPListen \u8fdb\u5165\u76d1\u542c<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>tcp_accept \u6ce8\u518c\u56de\u8c03<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u5e94\u7528 accept \u2192 TCPAccept<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u6302\u5165 ListenRequest \u961f\u5217<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u8fdc\u7aef SYN \u5230\u8fbe<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>lwIP \u5b8c\u6210\u4e09\u6b21\u63e1\u624b<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>tcp_accept \u56de\u8c03 \u2192 TCPAcceptEventHandler<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>TCPCheckPeerForAccept \u83b7\u53d6\u8fdc\u7aef\u5730\u5740<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u6210\u529f?<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u91ca\u653e\u65e7 socket \u4e0a\u4e0b\u6587<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>SocketContext &#061; newpcb<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>LibTCPAccept \u8bbe\u7f6e\u65b0 PCB \u56de\u8c03<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>CompleteBucket \u5b8c\u6210 accept IRP<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u4ee5\u9519\u8bef\u5b8c\u6210<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>\u5e94\u7528 accept \u8fd4\u56de\u65b0 socket<\/p>\n<p><\/span><\/p>\n<hr \/>\n<h3>15. \u6570\u636e\u6d41\u56fe<\/h3>\n<h4>15.1 \u5b8c\u6574\u7684\u53d1\u9001\u6570\u636e\u6d41<\/h4>\n<p>\u5e94\u7528\u7a0b\u5e8f send(buf)<br \/>\n  \u2502<br \/>\n  \u25bc<br \/>\nTDI_SEND IRP \u2192 DispTdiSend \u2192 TCPSendData<br \/>\n  \u2502<br \/>\n  \u2502 TDI_BUCKET { Complete, Context } \u6302\u5165 SendRequest<br \/>\n  \u2502<br \/>\n  \u25bc<br \/>\nLibTCPSend \u2192 tcpip \u7ebf\u7a0b \u2192 tcp_write(pcb, buf, len)<br \/>\n  \u2502<br \/>\n  \u2502 lwIP \u5c06\u6570\u636e\u52a0\u5165\u53d1\u9001\u961f\u5217, \u6784\u9020 TCP \u6bb5:<br \/>\n  \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n  \u2502 \u2502 TCP \u5934 (20B)                        \u2502<br \/>\n  \u2502 \u2502   SourcePort \/ DestPort             \u2502<br \/>\n  \u2502 \u2502   Seq &#061; snd_nxt                     \u2502<br \/>\n  \u2502 \u2502   Ack &#061; rcv_nxt                     \u2502<br \/>\n  \u2502 \u2502   Flags &#061; ACK | PSH                \u2502<br \/>\n  \u2502 \u2502   Window &#061; rcv_wnd                 \u2502<br \/>\n  \u2502 \u2502   Checksum &#061; TCP \u4f2a\u5934\u6821\u9a8c\u548c         \u2502<br \/>\n  \u2502 \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n  \u2502 \u2502 \u6570\u636e (\u5e94\u7528\u8d1f\u8f7d)                     \u2502<br \/>\n  \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n  \u2502<br \/>\n  \u25bc<br \/>\ntcp_output \u2192 IP \u5c42 (IPTransmitPacket)<br \/>\n  \u2502<br \/>\n  \u25bc<br \/>\n\u7f51\u7edc\u63a5\u53e3\u5c42 \u2192 LAN \u2192 NDIS \u2192 \u7f51\u5361<br \/>\n  \u2502<br \/>\n  \u25bc (\u8fdc\u7aef ACK \u5230\u8fbe)<br \/>\nlwIP tcp_in \u2192 tcp_sent \u56de\u8c03<br \/>\n  \u2502<br \/>\n  \u25bc<br \/>\nTCPSendEventHandler \u2192 \u5b8c\u6210\u7528\u6237 IRP<br \/>\n  \u2502<br \/>\n  \u25bc<br \/>\nsend() \u8fd4\u56de<\/p>\n<h4>15.2 \u5b8c\u6574\u7684\u63a5\u6536\u6570\u636e\u6d41<\/h4>\n<p>\u7f51\u5361 \u2192 NDIS \u2192 \u7f51\u7edc\u63a5\u53e3\u5c42 \u2192 IP \u5c42<br \/>\n  \u2502<br \/>\n  \u25bc<br \/>\nTCPReceive \u2192 LibIPInsertPacket \u2192 pbuf<br \/>\n  \u2502<br \/>\n  \u25bc<br \/>\ntcpip \u7ebf\u7a0b: tcp_input<br \/>\n  \u2502<br \/>\n  \u2502 \u6821\u9a8c\u548c\u9a8c\u8bc1 \u2192 \u5e8f\u53f7\u68c0\u67e5 \u2192 \u72b6\u6001\u673a\u5904\u7406<br \/>\n  \u2502<br \/>\n  \u25bc<br \/>\n\u6570\u636e\u5230\u8fbe \u2192 tcp_recv \u56de\u8c03 (InternalRecvEventHandler)<br \/>\n  \u2502<br \/>\n  \u251c\u2500 pbuf \u6302\u5165 Connection-&gt;PacketQueue<br \/>\n  \u251c\u2500 tcp_recved (\u6ed1\u52a8\u7a97\u53e3\u66f4\u65b0)<br \/>\n  \u2514\u2500 TCPRecvEventHandler<br \/>\n        \u2502<br \/>\n        \u25bc<br \/>\n    \u4ece ReceiveRequest \u53d6 Bucket<br \/>\n        \u2502<br \/>\n        \u25bc<br \/>\n    LibTCPGetDataFromConnectionQueue<br \/>\n        \u2502 \u4ece pbuf \u590d\u5236\u5230\u7528\u6237\u7f13\u51b2 (MDL)<br \/>\n        \u25bc<br \/>\n    CompleteBucket \u2192 \u5b8c\u6210 TDI IRP<br \/>\n        \u2502<br \/>\n        \u25bc<br \/>\n    DispDataRequestComplete \u2192 IoCompleteRequest<br \/>\n        \u2502<br \/>\n        \u25bc<br \/>\n    recv() \u8fd4\u56de\u6570\u636e<\/p>\n<h4>15.3 TDI_BUCKET \u751f\u547d\u5468\u671f<\/h4>\n<p>\u521b\u5efa (TCPSendData\/TCPReceiveData\/TCPConnect&#8230;)<br \/>\n  \u2502  ExAllocateFromNPagedLookasideList(TdiBucketLookasideList)<br \/>\n  \u25bc<br \/>\n\u6302\u8d77 (InsertTailList \u2192 PendingIrpList)<br \/>\n  \u2502  \u7b49\u5f85 lwIP \u4e8b\u4ef6<br \/>\n  \u25bc<br \/>\n\u89e6\u53d1 (TCP*EventHandlers)<br \/>\n  \u2502  RemoveHeadList<br \/>\n  \u25bc<br \/>\n\u5b8c\u6210 (CompleteBucket)<br \/>\n  \u2502  BucketCompletionWorker<br \/>\n  \u2502    \u251c\u2500 Complete(Context, Status, Information)  \u2192 \u5b8c\u6210\u7528\u6237 IRP<br \/>\n  \u2502    \u251c\u2500 DereferenceObject(Connection)<br \/>\n  \u2502    \u2514\u2500 ExFreeToNPagedLookasideList(Bucket)<br \/>\n  \u25bc<br \/>\n\u91ca\u653e<\/p>\n<hr \/>\n<h3>16. \u5173\u952e\u51fd\u6570\u7d22\u5f15<\/h3>\n<h4>16.1 TCP \u6838\u5fc3 (tcp.c)<\/h4>\n<table>\n<tr>\u51fd\u6570\u4f4d\u7f6e\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>TCPStartup<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L208-L240)<\/td>\n<td>\u521d\u59cb\u5316&#xff1a;\u7aef\u53e3\u96c6\/Bucket \u6c60\/LibIP\/\u6ce8\u518c\u534f\u8bae<\/td>\n<\/tr>\n<tr>\n<td>TCPShutdown<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L243-L265)<\/td>\n<td>\u6e05\u7406<\/td>\n<\/tr>\n<tr>\n<td>TCPSocket<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L153)<\/td>\n<td>\u521b\u5efa socket (LibTCPSocket)<\/td>\n<\/tr>\n<tr>\n<td>TCPConnect<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L301-L424)<\/td>\n<td>\u53d1\u8d77\u8fde\u63a5<\/td>\n<\/tr>\n<tr>\n<td>TCPDisconnect<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L426-L526)<\/td>\n<td>\u65ad\u5f00 (FIN\/RST)<\/td>\n<\/tr>\n<tr>\n<td>TCPSendData<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L579-L630)<\/td>\n<td>\u53d1\u9001\u6570\u636e<\/td>\n<\/tr>\n<tr>\n<td>TCPReceiveData<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L528-L577)<\/td>\n<td>\u63a5\u6536\u6570\u636e<\/td>\n<\/tr>\n<tr>\n<td>TCPReceive<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L192-L206)<\/td>\n<td>IP \u5c42\u63a5\u6536\u5165\u53e3<\/td>\n<\/tr>\n<tr>\n<td>TCPClose<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L177-L190)<\/td>\n<td>\u5173\u95ed\u8fde\u63a5<\/td>\n<\/tr>\n<tr>\n<td>TCPTranslateError<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L267-L299)<\/td>\n<td>err_t \u2192 NTSTATUS<\/td>\n<\/tr>\n<tr>\n<td>TCPAllocatePort \/ TCPFreePort<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L636-L655)<\/td>\n<td>\u7aef\u53e3\u7ba1\u7406<\/td>\n<\/tr>\n<tr>\n<td>TCPRemoveIRP<\/td>\n<td>[tcp.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/tcp.c#L695)<\/td>\n<td>\u53d6\u6d88 IRP<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>16.2 \u76d1\u542c\/\u63a5\u53d7 (accept.c)<\/h4>\n<table>\n<tr>\u51fd\u6570\u4f4d\u7f6e\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>TCPListen<\/td>\n<td>[accept.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/accept.c#L47-L105)<\/td>\n<td>\u76d1\u542c (LibTCPBind&#043;Listen)<\/td>\n<\/tr>\n<tr>\n<td>TCPAccept<\/td>\n<td>[accept.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/accept.c#L139)<\/td>\n<td>\u63a5\u53d7\u8fde\u63a5<\/td>\n<\/tr>\n<tr>\n<td>TCPCheckPeerForAccept<\/td>\n<td>[accept.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/accept.c#L17-L43)<\/td>\n<td>\u83b7\u53d6\u8fdc\u7aef\u5730\u5740<\/td>\n<\/tr>\n<tr>\n<td>TCPAbortListenForSocket<\/td>\n<td>[accept.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/accept.c#L107-L137)<\/td>\n<td>\u4e2d\u6b62\u76d1\u542c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>16.3 \u4e8b\u4ef6\u5904\u7406 (event.c)<\/h4>\n<table>\n<tr>\u51fd\u6570\u4f4d\u7f6e\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>TCPConnectEventHandler<\/td>\n<td>[event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L419-L441)<\/td>\n<td>\u8fde\u63a5\u5b8c\u6210<\/td>\n<\/tr>\n<tr>\n<td>TCPAcceptEventHandler<\/td>\n<td>[event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L230-L291)<\/td>\n<td>\u65b0\u8fde\u63a5\u63a5\u53d7<\/td>\n<\/tr>\n<tr>\n<td>TCPSendEventHandler<\/td>\n<td>[event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L293-L377)<\/td>\n<td>\u53ef\u53d1\u9001<\/td>\n<\/tr>\n<tr>\n<td>TCPRecvEventHandler<\/td>\n<td>[event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L379-L417)<\/td>\n<td>\u6570\u636e\u5230\u8fbe<\/td>\n<\/tr>\n<tr>\n<td>TCPFinEventHandler<\/td>\n<td>[event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L181-L228)<\/td>\n<td>\u8fde\u63a5\u7ec8\u6b62<\/td>\n<\/tr>\n<tr>\n<td>CompleteBucket<\/td>\n<td>[event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L37-L50)<\/td>\n<td>\u5b8c\u6210\u8bf7\u6c42\u6876<\/td>\n<\/tr>\n<tr>\n<td>BucketCompletionWorker<\/td>\n<td>[event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L21-L35)<\/td>\n<td>\u5b8c\u6210\u5de5\u4f5c\u9879<\/td>\n<\/tr>\n<tr>\n<td>FlushAllQueues<\/td>\n<td>[event.c](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/transport\/tcp\/event.c#L156-L179)<\/td>\n<td>\u6e05\u7a7a\u6240\u6709\u961f\u5217<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>16.4 lwIP \u7c98\u5408\u5c42 (lwip_glue\/tcp.c)<\/h4>\n<table>\n<tr>\u51fd\u6570\u4f4d\u7f6e\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>LibTCPSocket<\/td>\n<td>[tcp.c \u7c98\u5408](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c#L336)<\/td>\n<td>tcp_new<\/td>\n<\/tr>\n<tr>\n<td>LibTCPConnect<\/td>\n<td>[tcp.c \u7c98\u5408](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c#L621-L635)<\/td>\n<td>tcp_connect<\/td>\n<\/tr>\n<tr>\n<td>LibTCPSend<\/td>\n<td>[tcp.c \u7c98\u5408](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c#L556-L590)<\/td>\n<td>tcp_write&#043;tcp_output<\/td>\n<\/tr>\n<tr>\n<td>LibTCPBind<\/td>\n<td>[tcp.c \u7c98\u5408](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c#L414-L440)<\/td>\n<td>tcp_bind<\/td>\n<\/tr>\n<tr>\n<td>LibTCPListen<\/td>\n<td>[tcp.c \u7c98\u5408](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c#L469-L495)<\/td>\n<td>tcp_listen<\/td>\n<\/tr>\n<tr>\n<td>LibTCPShutdown<\/td>\n<td>[tcp.c \u7c98\u5408](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c)<\/td>\n<td>tcp_shutdown<\/td>\n<\/tr>\n<tr>\n<td>LibTCPClose<\/td>\n<td>[tcp.c \u7c98\u5408](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c)<\/td>\n<td>tcp_close<\/td>\n<\/tr>\n<tr>\n<td>LibTCPEnqueuePacket<\/td>\n<td>[tcp.c \u7c98\u5408](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c#L73-L84)<\/td>\n<td>pbuf \u5165\u961f<\/td>\n<\/tr>\n<tr>\n<td>LibTCPGetDataFromConnectionQueue<\/td>\n<td>[tcp.c \u7c98\u5408](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c#L100)<\/td>\n<td>pbuf \u51fa\u961f\u590d\u5236<\/td>\n<\/tr>\n<tr>\n<td>LibIPInsertPacket<\/td>\n<td>[ip.c \u7c98\u5408](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/ip.c)<\/td>\n<td>\u6ce8\u5165 IP \u5305<\/td>\n<\/tr>\n<tr>\n<td>LibTCPAccept<\/td>\n<td>[tcp.c \u7c98\u5408](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/ip\/lwip_glue\/tcp.c)<\/td>\n<td>\u8bbe\u7f6e\u65b0 PCB \u56de\u8c03<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>\u9644\u5f55 A&#xff1a;\u4fdd\u7559\u7684 Linux \u79fb\u690d\u7ed3\u6784 (tcpcore.h)<\/h3>\n<p>include\/tcpcore.h \u4fdd\u7559\u4e86 Linux \u5185\u6838 2.4.20 \u7684\u5b8c\u6574\u79fb\u690d&#xff1a;<\/p>\n<table>\n<tr>\u7ed3\u6784\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>struct sk_buff<\/td>\n<td>\u5957\u63a5\u5b57\u7f13\u51b2\u533a (head\/data\/tail\/end \u6307\u9488)<\/td>\n<\/tr>\n<tr>\n<td>struct skb_shared_info<\/td>\n<td>skb \u5171\u4eab\u4fe1\u606f (\u5206\u7247)<\/td>\n<\/tr>\n<tr>\n<td>struct sk_buff_head<\/td>\n<td>skb \u961f\u5217<\/td>\n<\/tr>\n<tr>\n<td>struct tcp_opt<\/td>\n<td>TCP \u9009\u9879\/\u72b6\u6001 (rcv_nxt\/snd_nxt\/snd_una\/snd_wnd \u7b49)<\/td>\n<\/tr>\n<tr>\n<td>struct sock<\/td>\n<td>socket \u72b6\u6001<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u4e9b\u7ed3\u6784\u4fdd\u7559\u4f46\u4e0d\u518d\u662f\u6d3b\u52a8\u5b9e\u73b0&#xff08;\u5f53\u524d\u4f7f\u7528 lwIP \u7684 struct tcp_pcb&#xff09;\u3002<\/p>\n<h3>\u9644\u5f55 B&#xff1a;\u53c2\u8003\u6587\u6863<\/h3>\n<ul>\n<li>[tcpip\u4f20\u8f93\u5c42UDP\u5206\u6790](file:\/\/\/d:\/reactos\/doc\/tcpip\u4f20\u8f93\u5c42UDP\u5206\u6790.md) \u2014 UDP \u4f20\u8f93\u5c42<\/li>\n<li>[tcpip\u7f51\u7edc\u5c42IP\u5206\u6790](file:\/\/\/d:\/reactos\/doc\/tcpip\u7f51\u7edc\u5c42IP\u5206\u6790.md) \u2014 IP \u7f51\u7edc\u5c42<\/li>\n<li>[TCPIP \u9a71\u52a8\u5206\u6790](file:\/\/\/d:\/reactos\/doc\/TCPIP_\u9a71\u52a8\u5206\u6790.md) \u2014 tcpip.sys \u6574\u4f53<\/li>\n<li>[lwIP \u6e90\u7801](file:\/\/\/d:\/reactos\/drivers\/network\/tcpip\/lwip\/) \u2014 lwIP \u534f\u8bae\u6808<\/li>\n<li>RFC 793 \u2014 Transmission Control Protocol<\/li>\n<li>RFC 1122 \u2014 Requirements for Internet Hosts<\/li>\n<li>RFC 2581 \u2014 TCP Congestion Control<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790<br \/>\n\u76ee\u5f55<br \/>\n\u6982\u8ff0TCP \u5c42\u6574\u4f53\u67b6\u6784TCP \u62a5\u6587\u683c\u5f0fTCP \u72b6\u6001\u673a\u8fde\u63a5\u7aef\u70b9\u7ed3\u6784 (CONNECTION_ENDPOINT)TDI_BUCKET \u4e0e IRP \u961f\u5217\u6a21\u578b\u8fde\u63a5\u7ba1\u7406\u76d1\u542c\u4e0e\u63a5\u53d7\u6570\u636e\u53d1\u9001\u8def\u5f84\u6570\u636e\u63a5\u6536\u8def\u5f84\u4e8b\u4ef6\u5904\u7406\u5668lwIP \u7c98\u5408\u5c42\u4e0e tcpip \u7ebf\u7a0b\u6a21\u578b\u65ad\u5f00\u4e0e\u6e05\u7406\u5de5\u4f5c\u6d41\u7a0b\u56fe\u6570\u636e\u6d41\u56fe\u5173\u952e\u51fd\u6570\u7d22\u5f15 1. \u6982\u8ff0<br \/>\nTCP (Transmission Control Protocol&#xff0c;\u4f20\u8f93\u63a7\u5236\u534f\u8bae) \u662f TCP\/IP \u534f\u8bae<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[205,78,191],"topic":[],"class_list":["post-92122","post","type-post","status-publish","format-standard","hentry","category-server","tag-tcp-ip","tag-78","tag-191"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/92122.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790 \u76ee\u5f55 \u6982\u8ff0TCP \u5c42\u6574\u4f53\u67b6\u6784TCP \u62a5\u6587\u683c\u5f0fTCP \u72b6\u6001\u673a\u8fde\u63a5\u7aef\u70b9\u7ed3\u6784 (CONNECTION_ENDPOINT)TDI_BUCKET \u4e0e IRP \u961f\u5217\u6a21\u578b\u8fde\u63a5\u7ba1\u7406\u76d1\u542c\u4e0e\u63a5\u53d7\u6570\u636e\u53d1\u9001\u8def\u5f84\u6570\u636e\u63a5\u6536\u8def\u5f84\u4e8b\u4ef6\u5904\u7406\u5668lwIP \u7c98\u5408\u5c42\u4e0e tcpip \u7ebf\u7a0b\u6a21\u578b\u65ad\u5f00\u4e0e\u6e05\u7406\u5de5\u4f5c\u6d41\u7a0b\u56fe\u6570\u636e\u6d41\u56fe\u5173\u952e\u51fd\u6570\u7d22\u5f15 1. \u6982\u8ff0 TCP (Transmission Control Protocol&#xff0c;\u4f20\u8f93\u63a7\u5236\u534f\u8bae) \u662f TCP\/IP \u534f\u8bae\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/92122.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-09T04:16:50+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/92122.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/92122.html\",\"name\":\"tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-08-09T04:16:50+00:00\",\"dateModified\":\"2026-08-09T04:16:50+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/92122.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/92122.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/92122.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/92122.html","og_locale":"zh_CN","og_type":"article","og_title":"tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790 \u76ee\u5f55 \u6982\u8ff0TCP \u5c42\u6574\u4f53\u67b6\u6784TCP \u62a5\u6587\u683c\u5f0fTCP \u72b6\u6001\u673a\u8fde\u63a5\u7aef\u70b9\u7ed3\u6784 (CONNECTION_ENDPOINT)TDI_BUCKET \u4e0e IRP \u961f\u5217\u6a21\u578b\u8fde\u63a5\u7ba1\u7406\u76d1\u542c\u4e0e\u63a5\u53d7\u6570\u636e\u53d1\u9001\u8def\u5f84\u6570\u636e\u63a5\u6536\u8def\u5f84\u4e8b\u4ef6\u5904\u7406\u5668lwIP \u7c98\u5408\u5c42\u4e0e tcpip \u7ebf\u7a0b\u6a21\u578b\u65ad\u5f00\u4e0e\u6e05\u7406\u5de5\u4f5c\u6d41\u7a0b\u56fe\u6570\u636e\u6d41\u56fe\u5173\u952e\u51fd\u6570\u7d22\u5f15 1. \u6982\u8ff0 TCP (Transmission Control Protocol&#xff0c;\u4f20\u8f93\u63a7\u5236\u534f\u8bae) \u662f TCP\/IP \u534f\u8bae","og_url":"https:\/\/www.wsisp.com\/helps\/92122.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-08-09T04:16:50+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"24 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/92122.html","url":"https:\/\/www.wsisp.com\/helps\/92122.html","name":"tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-08-09T04:16:50+00:00","dateModified":"2026-08-09T04:16:50+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/92122.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/92122.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/92122.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"tcpip.sys \u4f20\u8f93\u5c42 (TCP) \u8be6\u7ec6\u5206\u6790"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/92122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=92122"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/92122\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=92122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=92122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=92122"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=92122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}