浅谈TCP协议栈ppt课件_第1页
浅谈TCP协议栈ppt课件_第2页
浅谈TCP协议栈ppt课件_第3页
浅谈TCP协议栈ppt课件_第4页
浅谈TCP协议栈ppt课件_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、浅谈浅谈TCP协议栈协议栈主要内容主要内容概述概述衔接建立衔接建立数据传输数据传输衔接释放衔接释放概述概述衔接建立数据传输衔接释放TCP衔接的生命周期tcp_request_socktcp_socktcp_timewait_sockTCP传输控制块构造概述概述tcp_request_sock:在衔接建立过程中运用该构造来描:在衔接建立过程中运用该构造来描画衔接,从接纳到画衔接,从接纳到SYN直到衔接被直到衔接被accept之前存在之前存在tcp_sock:在衔接建立之后到终止之前运用,这种传输:在衔接建立之后到终止之前运用,这种传输控制块的生命期最长,发送和接纳段都需求它进展控制控制块的生命期

2、最长,发送和接纳段都需求它进展控制tcp_timewait_sock:只存在于自动封锁衔接一方,终止:只存在于自动封锁衔接一方,终止衔接过程中运用衔接过程中运用.syn_table概述概述.inet_conn.struct tcp_sock tcp_request_sock构造实例存储在监听套接字的半衔接队列其实是散列表中,hash函数为inet_csk_reqsk_queue_hash_add(),已完成衔接建立过程未被accept的衔接存储在监听套接字的已衔接队列中。构造如以下图所示:.icsk_accept_queue.struct inet_connection_sockrskq_ac

3、cept_headrskq_accept_tail.listen_optstruct request_sock_queuedl_next.sk.struct request_sockdl_next.sk.struct request_sockNULLstruct tcp_sockstruct tcp_sockstruct listen_sockdl_next.sk.struct request_sockdl_next.sk.struct request_sockNULLNULL概述概述.ehash. listening_hash.struct inet_hashinfo.ehash_size.

4、sk_nodesk_state.struct tcp_sock.sk_nodesk_state.struct tcp_sock.sk_nodesk_state=TCP_LISTEN.struct tcp_sock.sk_nodesk_state=TCP_LISTEN.struct tcp_sock 一切的TCP传输控制块由tcp_hashinfo全局变量管理,LISTEN形状的传输控制块由listening_hash散列表管理,hash函数为inet_hash();除LISTEN形状外的传输控制块包括tcp_timewait_sock构造由ehash散列表管理,hash函数为_inet_has

5、h_nolisten。构造如以下图所示:32衔接建立衔接建立TCP衔接建立的三种方式:衔接建立的三种方式:正常三次握手正常三次握手SYN cookies机制机制同时翻开同时翻开衔接建立过程衔接建立过程SYN_SENTSYN_RCVDESTABLISHEDESTABLISHEDClientServerSYN xSYN y, ack x+1ack y+1SYN_SENTESTABLISHEDESTABLISHEDClientServerSYN xSYN cookie, ack x+1Ack cookie+1SYN_SENTSYN_SENTESTABLISHEDESTABLISHEDClientSe

6、rverSYN x正常三次握手SYN cookies机制同时翻开SYN ySYN_RCVDSYN_RCVDSYN x, ack y+1SYN y, ack x+1Client-发送发送SYN段段tcp_v4_connect()检查地址长度和协议族类型ip_route_connect()设置源IP地址、目的IP地址和端口号,初始化对端MSS的上限值,形状置为TCP_SYN_SENTinet_hash_connect()inet_get_local_port_range()没有可用端口?选择一个端口号,遍历inet_bind_hashbucket散列表前往EADDRNOTAVAIL错误前往EINV

7、AL错误已运用?_inet_check_established()inet_bind_bucket_create()tb-fastreuse = 0inet_bind_hash()已参与ehash散列表?设置本地端口号假设是复用TIME_WAIT形状的套接字的端口,那么释放对应的套接字ip_route_newports()secure_tcp_sequence_number()ip_route_newports()前往_inet_hash_nolisten()失败胜利是否TrueFalse是否FalseTrue是tcp_connect()否Client -接纳接纳SYN+ACK段段tcp_v4

8、_rcv()_inet_lookup_skb()tcp_v4_do_rcv()初始化窗口有关的成员、PMTU、MSS和时间戳等,形状置为TCP_ESTABLISHEDtcp_v4_send_reset()tcp_rcv_state_process()tcp_parse_options()tcp_rcv_synsent_state_process()th-ack检查确认序列号检查时间戳能否设置SOCK_DEAD标志sock_def_wakeup()能否有数据发送恳求延迟发送ACK,并且进入快速确认方式tcp_send_ack()前往_kfree_skb()形状置为TCP_SYN_RECV ,初始

9、化窗口有关的成员、PMTU、MSS和时间戳等PAWS检测tcp_send_synack()sk_wake_async()FalseTrue失败胜利胜利失败否是胜利失败否是Server-接纳到接纳到SYN包包 tcp_v4_rcv()_inet_lookup_skb()tcp_rcv_state_process()tcp_v4_do_rcv()tcp_v4_conn_request()假设衔接队列到达上限并且半衔接队列中未重传过的衔接恳求块数量大于1,那么会丢弃当前衔接恳求inet_reqsk_alloc ()初始化衔接恳求块want_cookiecookie_v4_init_sequence(

10、)tcp_v4_init_sequence()进展PAWS和SYN flood攻击检测_tcp_v4_send_synack()want_cookieinet_csk_reqsk_queue_hash_add()reqsk_free ()前往TrueFalse即使启用SYN cookies机制也不一定可以建立衔接TrueFalse启动衔接建立定时器inet_csk_reqsk_queue_is_full()sysctl_tcp_syncookieswant_cookie置为1kfree_skb()前往FalseTrueTrueFalseServer-接纳到接纳到ACK包包 tcp_v4_rcv

11、()_inet_lookup_skb()tcp_v4_hnd_req()tcp_v4_do_rcv()tcp_check_req()tcp_v4_syn_recv_sock()sk_acceptq_is_full()tcp_abort_on_overflowtcp_v4_send_reset()设置acked标志前往inet_csk_search_req()cookie_v4_check()tcp_syncookies前往监听套接字,上层会发送RST给客户端cookie_check()调用inet_reqsk_alloc()分配衔接恳求块并初始化get_cookie_sock()创建衔接传输控

12、制块,并进展初始化。添加到ehash散列表中,并进展本地端口的绑定,前往新的sock构造将衔接恳求块从半衔接队列中移到已衔接队列中,新的sock构造存储在request_sock构造的sk成员中tcp_child_process()tcp_rcv_state_process()将新的传输控制块设置为ESTABLISHED形状,并初始化MTU、预测标志等胜利失败是否表示曾经接纳到ACK段,衔接定时器会根据该标志重传SYN+ACK段,再次尝试建立衔接未启用启用失败胜利未启用启用前往数据传输数据传输TCP段的输出段的输出TCP段的输入段的输入TCP段的输出段的输出-整体流程整体流程tcp_sendm

13、sg()tcp_sendpage()tcp_v4_send_reset()tcp_send_active_reset()tcp_send_ack()tcp_v4_send_ack()_tcp_v4_send_synack()tcp_connect()tcp_send_fin()ip_send_reply()tcp_write_xmit()ip_build_and_send_pkt()tcp_transmit_skb()ip_queue_xmit()TCP段的输出段的输出-tcp_write_xmit()tcp_write_xmit()tcp_mtu_probe()发送队列为空?tcp_init

14、_tso_segs()拥塞窗口为0?发送窗口足够?计算分段段长,以发送窗口和拥塞窗口的最小值作为分段段长tso_fragment()tcp_transmit_skb()假设SKB包可以克隆,那么克隆SKB,否那么复制SKBtcp_v4_send_check()ip_queue_xmit()数据长度超越分段段长?能否需求分段?tcp_nagle_test()tcp_tso_should_defer()前往初始化TCP首部,构建首部选项是否是否否是否是FalseTrueTrueFalse是否tcp_event_new_data_sent()TCP段的输出段的输出-滑动窗口滑动窗口发送端接纳端运用程

15、序写入2KB空2K满2K2K1K缓冲区 2KB SEQ=0 ACK=2048 WIN=2048 2KB SEQ=2048运用程序写入2KB ACK=4096 WIN=0 ACK=4096 WIN=2048发送端被阻塞运用程序读出2KB 1KB SEQ=4096发送端可以发送2KB 0KB SEQ=4095继续定时器超时后才会发送,假设处于urgent mode,还发发送一个序号为SND.UNA的段04KTCP段的输出段的输出-Nagle算法算法Nagle算法的根本思想:算法的根本思想: 当数据每次以很少量方式进入到发送端,发送端只是发送第一次到当数据每次以很少量方式进入到发送端,发送端只是发送

16、第一次到达的数据字节,然后将其与后面到达的字节缓存起来,直到发送出去的达的数据字节,然后将其与后面到达的字节缓存起来,直到发送出去的那个数据包被确认。假设缓存的数据可以填满一个最大数据段,该算法那个数据包被确认。假设缓存的数据可以填满一个最大数据段,该算法也允许发送一个新的段。也允许发送一个新的段。优点:优点: 能更有效地利用数据包的可用空间,减少发送端发送的数据包数量能更有效地利用数据包的可用空间,减少发送端发送的数据包数量缺陷:缺陷: 1. 在需求快速的短数据包流的运用下,会呵斥延迟在需求快速的短数据包流的运用下,会呵斥延迟 2. 与延迟确认相互作用,能够会呵斥短暂的死锁与延迟确认相互作用

17、,能够会呵斥短暂的死锁TCP段的输出段的输出-tcp_nagle_test() tcp_nagle_test()用于检测在不思索拥塞的情况下能否立刻输出用于检测在不思索拥塞的情况下能否立刻输出TCP段,段,当检测到以下条件会立刻输出:当检测到以下条件会立刻输出: 设置设置TCP_NAGLE_PUSH标志标志 当前段不是发送队列中最后一个段当前段不是发送队列中最后一个段 Urgent Mode 带有带有FIN标志的段标志的段 重传超时后,启用重传超时后,启用F-RTO算法接纳到算法接纳到ACK段的数目等于段的数目等于2 全负荷段全负荷段 设置设置TCP_NODELAY选项选项 没有设置没有设置T

18、CP_CORK,并且一切输出的段都已确认,并且一切输出的段都已确认TCP段的输出段的输出-RTT和和RTO的计算的计算1030205040RTT(ms)概率0.30.10.2RTT概率分布概率分布1T2TRSRTTSRTT)1 (SRTT的计算公式:其中是平滑因子,典型情况下=7/8RSRTTSRTTRTTVAR)1 (RTTVAR的计算公式:典型情况下=3/4RTTVARSRTTRTO4RTO的计算公式:Karn算法:算法: 不更新任何重传段的估算值。此外,每次延续重传的超时时间间隔值加倍,直到段能一次经过为止不更新任何重传段的估算值。此外,每次延续重传的超时时间间隔值加倍,直到段能一次经过

19、为止TCP段的输入段的输入-整体流程整体流程tcp_v4_rcv()是TCP协议接纳数据的总入口,整体的接纳流程如以下图所示:tcp_v4_rcv()_inet_lookup_skb()sk_add_backlog()tcp_v4_do_rcv()sock_owned_by_user()后备队列prequeue队列接纳队列乱序队列预期的数据段?tcp_prequeue()TrueFalse胜利失败是否tcp_rcv_established()TCP段的输入段的输入-tcp_rcv_established()首部预测tcp_rcv_established()首部中只存在时间戳选项?tcp_par

20、se_aligned_timestamp()PAWS检测没有负荷?tcp_ack()_kfree_skb()tcp_data_snd_check()前往可以直接复制到用户空间?用户进程正在读取数据?tcp_copy_to_iovec()已复制数据?更新时间戳、往返时间以及下一个要接纳的段的序号tcp_checksum_complete_user()更新时间戳、往返时间,去掉TCP首部,添加到接纳队列,并更新下一个要接纳的段的序号tcp_event_data_recv()还有段未确认?_tcp_ack_snd_check()假设已复制,那么释放SKB,否那么唤醒等待队列tcp_validate_

21、incoming ()检测长度和校验和设置了ACK标志?tcp_ack()tcp_rcv_rtt_measure_ts()tcp_urg()tcp_data_snd_check()tcp_ack_snd_check()tcp_data_queue()前往胜利失败否是胜利失败是否是否是否是否是否胜利失败是否是否TCP段的输入段的输入-快速途径和慢速途径快速途径和慢速途径ESTABLISHED形状下形状下TCP段的处置有两种途径:段的处置有两种途径:快速途径:用于处置预期、理想情况下的输入段,尽能够地检测并最优化快速途径:用于处置预期、理想情况下的输入段,尽能够地检测并最优化处置,不会检测一些边缘

22、情况处置,不会检测一些边缘情况慢速途径:用于一切和预期、理想不对应的且需求进一步处置的段慢速途径:用于一切和预期、理想不对应的且需求进一步处置的段TCP段的输入段的输入-执行快速途径的条件执行快速途径的条件TCP首部中第首部中第4个个32位字屏蔽保管的位和位字屏蔽保管的位和PSH后的值和预测标志相等后的值和预测标志相等段的序列号等于套接字下一个要接纳的序列号段的序列号等于套接字下一个要接纳的序列号确认序列号小于或等于下一个要发送的段的序列号确认序列号小于或等于下一个要发送的段的序列号假设存在时间戳选项,没有发生序号回卷假设存在时间戳选项,没有发生序号回卷TCP段的输入段的输入-预测标志预测标志

23、S?00010000snd_wnd03127231916doffres1cwreceurgackpshrstsynfinwindow03127231916预测标志格式预测标志格式TCP首部第首部第4个个32位字位字 预测标志由预测标志由tcp_fast_path_check()函数设置,其格式与函数设置,其格式与TCP首部的第首部的第4个个32位字位字一一对应,如下所示:一一对应,如下所示:TCP段的输入段的输入-设置预测标志的条件设置预测标志的条件乱序队列为空乱序队列为空接纳窗口不为接纳窗口不为0当前已运用的接纳缓存未到达上限当前已运用的接纳缓存未到达上限没有收到紧急数据没有收到紧急数据TC

24、P段的输入段的输入-快速确认和延迟确认快速确认和延迟确认.快速确认方式快速确认方式发送端接纳端发送端接纳端a接纳到两个段b延迟0.5s发送端接纳端0.5sACK延迟确认方式延迟确认方式DataDataDataDataDataDataACKACKACKACKTCP段的输入段的输入-快速确认段数快速确认段数 调用调用tcp_enter_quickack_mode()后,传输控制块便会进入快速确认模后,传输控制块便会进入快速确认模式,允许发送的快速确认段数为:式,允许发送的快速确认段数为:)162(_2_quickacksmssrcvwndrcvquickacksTCP段的输入段的输入-SACK发送

25、端接纳端丧失丧失seq=SEG1seq=SEG2seq=SEG3seq=SEG4seq=SEG5seq=SEG6ack=SEG2ack=SEG2ack=SEG2ack=SEG2seq=SEG2seq=SEG3seq=SEG4seq=SEG5seq=SEG6未启用未启用SACK选项选项发送端接纳端丧失丧失seq=SEG1seq=SEG2seq=SEG3seq=SEG4seq=SEG5seq=SEG6ack=SEG2ack=SEG2,sack:SEG3seq=SEG2seq=SEG5启用启用SACK选项选项ack=SEG2,sack:SEG3-SEG4ack=SEG2,sack:SEG6, SEG

26、3-SEG4TCP段的输入段的输入-低能窗口综合征低能窗口综合征接纳端的缓冲区为满运用程序读取一个字节多出一个字节的空闲区发送窗口更新段新字节抵达接纳端的缓冲区为满头头1个字节接纳端的缓冲区为满运用程序读取一个字节多出足够的空闲区发送窗口更新段新字节抵达接纳端的缓冲区为满头头 低能窗口综合症低能窗口综合症(Silly Window syndrome)Clark算法算法.运用程序读取n个字节)2_,min(BUFRCVMSSbuf 衔接释放衔接释放TCP衔接释放的两种方式:衔接释放的两种方式:正常四次握手正常四次握手同时封锁同时封锁衔接释放过程衔接释放过程FIN_WAIT_1CLOSE_WAITTIME_WAITCLOSEDClientServerFIN xACK x+1ACK y+1正常四次握手同时封锁FIN yLAST_ACKFIN_WAIT_2FIN_WAIT_1CLOSINGTIME_WAITTIME_WAITClientServerFIN xACK y+1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论