zoukankan      html  css  js  c++  java
  • 第五节 面向连接传输:TCP

    第五节 面向连接传输:TCP
     


       TCP概述RFCs:793,1122,1323,2018,2581
       点对点:
       一个发送方,一个接收方
       可靠,按序的字节流:
       无“报文边界”,无结构但有顺序
       流水式控制:
       TCP的拥塞和流量控制,设置窗口大小
       发送&接收缓存
       全双工数据传输:
       在同一连接上双向传输
       MSS:maximum segment size(最大段字节数-1500,536,512)
       面向连接:
       握手过程(交换控制信息)在交换数据前初始化收发双方的状态“三次握手”
       流量控制:
       发送方的发送速度不得超过接收方的处理速度
    TCP段格式(p80)

    TCPseq.#’s和ACKs
       Seq.#’s:
       该数据段第一个字节在(整个报文)字节流中“编号”
       ACKs:
       seq#为预期从对方发来的“下一个”字节的编号
       积累的ACK
       Q:接收方如何接受失序的数据段
       A:TCP没有定义,-由程序设计者决定

    TCP:可靠数据传输

       简化的发送方,假设
       单向数据传输
       无流量,拥塞控制
    TCP:可靠数据传输
       简化的TCP发送方
       00 sendbase=initial_sequence number
       01 nextseqnum = initial_sequence number
       02
       03 loop (forever) {
       04 switch(event)
       05 event:data received from application above
       06 create TCP segment with sequence number nextseqnum
       07 start timer for segment nextseqnum
       08 pass segment to IP
       09 nextseqnum=nextseqnum + length(data)
       10 event:timer timeout for segment with sequence number y
       11 retransmit segment with sequence number y
       12 compue new timeout interval for segment y
       13 restart timer for sequence number y
       14 event:ACK received, with ACK field value of y
       15 if (y > sendbase) { /* cumulative ACK of all data up to y */
       16 cancel all timers for segments with sequence numbers < y
       17 sendbase = y
       18 }
       19 else { /* a duplicate ACK for already ACKed segment */
       20 increment number of duplicate ACKs received for y
       21 if (number of duplicate ACKS received for y == 3) {
       22 /* TCP fast retransmit */
       23 resend segment with sequence number y
       24 restart timer for segment y
       25 }
       26 } /* end of loop forever */
    TCP ACK规则
      
    TCP:重传场景

    TCP流量控制
       流量控制
       发送端不可发送的太多、太快以至于使得接收端的缓存溢出
       RcvBuffer=接收端的 TCP 缓存大小
       RcvWindow=缓存中空闲的部分

       接收端:显式通知发送端(动态变化中的)自由缓存空间
       RcvWindow TCP数据段的字段
       发送端:需要保存已经发送,unACKed数据可少于最近收到的RcvWindow
    TCP连接管理
       TCP收发双方在数据交换开始之前需要建立连接
       初始化TCP变量:
       seq.#s
       缓存,流量控制信息(e.g. RcvWindow)
       客户端:连接的发起者
       Socket clientSocket=new Socket("hostname","port number"); -JAVA
       服务器:接受客户端的连接
       Socket connectionSocket=welcomeSocket.accept();
       (建立连接)三次握手:
       Step1:客户端的end system向服务器发送TCP SYN控制数据段
       定义并初始化seq#
       Step 2:服务器的end system接收SYN,用SYNACK控制数据段回答
       ACKs接收到的SYN
       分配缓存
       定义server-> receiver初始化seq.#
       Step3:客户端的end system向服务器发送ACK
       ACKs接收到的连接承诺
       分配缓存
    TCP连接管理(续)
       关闭连接:
       客户端关闭插口:clientSocket.close();
       Step1:客户端发送 TCP FIN 控制段给服务器
       Step2:服务器收到
       FIN,用ACK应答.关闭连接,发送FIN.

    TCP 连接管理(续)
       Step3:客户端收到FIN,用ACK进行应答.
       随着对接收到的FIN发送ACK-同时进入“timed wait(计时等待)”
       Step4:服务器,接收ACK.连接关闭.
       注意:稍加修改,即可管理同时发生的多个FINs.

    TCP连接管理(续)

  • 相关阅读:
    67. Add Binary
    66. Plus One
    64. Minimum Path Sum
    63. Unique Paths II
    How to skip all the wizard pages and go directly to the installation process?
    Inno Setup打包之先卸载再安装
    How to change the header background color of a QTableView
    Openstack object list 一次最多有一万个 object
    Openstack 的 Log 在 /var/log/syslog 里 【Ubuntu】
    Git 分支
  • 原文地址:https://www.cnblogs.com/dantefung/p/5113207.html
Copyright © 2011-2022 走看看