zoukankan      html  css  js  c++  java
  • 传输控制协议TCP

    一、TCP特点

      

    二、TCP是面向连接的协议。运输连接是用来传送TCP报文的。

      TCP运输连接的建立和释放是每一次面向连接的通信中不可缺少的过程

      (1) 建立连接要解决什么问题?如何建立连接?

        TCP连接建立过程中要解决三个问题:

          ~ 要使每一方都能够确知对方的存在

          ~ 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)

          ~ 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分匹配

        用三次握手建立连接:

        B 的 TCP 服务器进程先创建传输控制块TCP(存储每一个连接中一些重要的信息,如TCP连接表、到发送和接受缓存的指针、

      到重传队列的指针、当全的发送和接受序号等,和进程控制块的PCB类似),准备接受客户A进程的链接请求。然后如无其进

        程就处于listen(收听)状态,等待客户的链接请求。如有,即做出响应

        A 的 TCP客户进程创建TCB,向 B 发送请求报文段,首部的同步位SYN=1,初始序号seq=x。TCP规定,SYN报

      文段(SYN=1)不能携带数据,但要消耗一个序号。           这时,TCP客户进程进入SYN-sent(同步已发送)状态

        B 收到链接请求报文段后,如同意建立链接,则向A发送rcvd。在rcvd报文中应把SYN位和ACK位都置1,确认号是ack=x+1,

      给自己选择一个初始序号seq=y,同上这个报文段不能携带数据,同样消耗一个序号。        这时,TCP客户端进入SYN-sent状态

        此时,如果B同意链接,一次握手完成,B可以知道自己能接受到 A 给自己发送的报文,但是不知道 A 能否接受自己发送报

        文

        A 收到 B 的确认后,还要向 B 给出确认。确认报文段的ACK置1,确认号ack=y+1,自己的序号seq=x+1, TCP规定,ACK报

      文段可以携带数据。但是如果不携带数据则不消耗序号。   这时,TCP链接已建立,A进入estABlished状态

        此时,二次握手完成,A 知道 B 可以接受自己发送的报文

        当 B 收到 A 的确认后,也进入 EstABlished状态。

        此时,三次握手建立链接完成,B 知道自己发送报文 A可以接受到。既然三次握手已经可以建立可靠的链接,那么,四次、

        五次··· 当然是可以的,但是为了实际效率和节省资源等问题还是选择三次握手

       (2) TCP的链接释放(四次挥手)?

       

      ***为什么 A 要进入TIME-WAIT状态?

      A 在最后一次收到 B 的确认(链接释放报文)后,必须对此发出确认,此时,TCP链接还没有释放掉,必须经过

      时间等待计时器(time-wait timer)设置的时间2MSL后,A 才进入CLOSE状态。“MSL”是最长报文寿命

      ***为什么 A 在 time-wait 状态必须等待2MSL的时间呢?

      第一:为了保证 A 发送最后一个 ACK 报文段能够到达 B 

      第二:防止已失效的链接请求报文段

    我认为三次握手、四次挥手,我们思考时,思想一定要完整一点,任何一方发送报文,一定要确定自己 可以发,并且

    确定对方可以收到自己发送的报文,这才算是最简单的一方完整。

     

      

    安心下来做技术,笑是最大的福气
  • 相关阅读:
    WPF控件模型
    WPF布局之Canvas
    WPF布局之Grid
    WPF布局之Panel
    cxGrid让指定的某行自动呈选选中的状态
    VMware Esxi5.5中嵌套虚拟机的网络设置方法
    SQLServer (2005/2008) 日志清理方法
    控制cxGrid 主从表的明细只展开一个
    关于Delphi cxGrid主从表中从表只能编辑第一条记录的问题
    自动化工程师面试常见问题
  • 原文地址:https://www.cnblogs.com/JN-PDD/p/7096465.html
Copyright © 2011-2022 走看看