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连接管理(续)

  • 相关阅读:
    Hive性能分析和优化方法
    浅谈MySQL中优化sql语句查询常用的30种方法
    spark 源码阅读博客
    spark shell学习笔记
    用shell 实现对MySQL数据库分页
    hive 1.2 配置
    spark1.4配置安装
    HBase学习
    【转】解密饿了么大前端团队
    【转】我心目中的支付宝架构
  • 原文地址:https://www.cnblogs.com/dantefung/p/5113207.html
Copyright © 2011-2022 走看看