zoukankan      html  css  js  c++  java
  • 计算机网络TCP“三次握手”

    终于有时间写这篇文章了,最近真的比较忙!

    TCP协议  三次握手

      引言:我们知道,TCP是面向连接的协议(相较于UDP无连接的协议),会在传送数据之前先在 发送端 & 接收端 之间建立一条连接,所以实现了可靠传输。而运输链接是用来传送TCP报文的。TCP运输连接的建立,是面向连接的通信协议传送数据之前必需的一个步骤。

     一次传输涉及到三个步骤:

    • 建立连接(本篇所涉及)
    • 传送数据
    • 释放连接

      在建立连接时,有趣的“三次握手”就粉墨登场了。

      所谓三次握手,其实是发送端&接收端在传送数据之前的 一次握手,发送了三次报文而已。下面具体说明连接建立(握手)的过程。

      Notice:发送端以及接收端 通常指 客户端和它所请求的服务器,书上一般是这样写的,但这里我还是采用 发送端&接收端 来叙述。

      在传送之初,发送端进程(应用层) 先创建传输控制块(Transmission Control Block, TCB)。当要向某端发送数据(TCP报文段)时:

    发送端:--------------------1

      发出连接请求报文段(规定不能携带数据,但要消耗序号,以便识别应答报文段)先将报文段首部的 同步位SYN = 1, 并选择一个初始序号 seq = x, 发出此报文段(发送端口&目的端口等也要设置好),进入 SYN-SENT(同步请求已发送)状态。

    接收端:(此前一直处于Liscen 侦听状态,就像服务器一样)----------------------2

      收到连接请求报文段后,若同意连接(就像服务器允许访问,不允许就返回错误码),向发送端 发送确认连接报文段:同样 同步位SYN = 1,确认位 ACK = 1(表明确认报文段有效/这是有效回答报文段), 同样需要选择报文序号 seq = y, 应答号ack = x+1(表明是对序号x的请求报文段的确认应答),向原发送端发出此报文段(端口要绑定好),进入SYN-RCVD(同步接受)状态。

    发送端:--------------------3

      收到确认连接报文段后,再次向接收端给出确认(Why?后续文章会解释):已经达到了同步,于是此报文段就不再需要SYN,直接 确认ACK = 1 seq = x+1ack = y+1,发送报文段。发送端进入ESTABLISHED(运输连接已建立)状态。

    接收端

      收到发送端的确认后,进入ESTABLISHED(运输连接已建立)状态。(未发送报文,不算在内)

      传送数据......

      释放连接......(后面文章)。

      其实,在我看来,“三次握手”即“三报文握手”,就像是 表白 一样。下面是有趣的理解:

    “三次握手”------表白版

    男生:---------------------1

      “小姐姐, 我喜欢你, 你喜欢我吗?”  SYN=1, seq=x                进入表白发送完成状态

    漂亮姐姐: --------------2

      (如果同意)“啊!是吗!我也喜欢你呢!”  SYN=1, ACK=1, seq=y, ack=x+1   进入表白接受状态

    男生:---------------------3

      “那小姐姐以后就是我的啦!” ACK=1, seq=x+1, ack=y+1            进入恋爱状态

    漂亮姐姐:进入恋爱状态。

  • 相关阅读:
    scala的泛型浅析
    spark2.0的10个特性介绍
    spark2.0 DataSet操作的一些问题记录
    scala中ClassOf、asInstenceOf、isInstanceOf三个预定义方法分析
    Java 多线程与并发编程专题
    java nio入门
    MySQL索引优化详解
    shiro学习笔记-Subject#login(token)实现过程
    【转】线程八锁
    ReadWriteLock读写锁
  • 原文地址:https://www.cnblogs.com/yocichen/p/9937590.html
Copyright © 2011-2022 走看看