zoukankan      html  css  js  c++  java
  • Wireshark-TCP协议分析(包结构以及连接的建立和释放)

    TCP:传输控制协议

      TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。
      面向连接: 面向连接意味着使用tcp的应用程序在数据传输前必须先建立连接。就如打电话一样。要先进行拨号,等待对方响应才干開始说话。


      可靠性:tcp协议通过下列方式来提高可靠性:

    • 应用数据被切割成TCP觉得最适合发送的数据块。

      这和UDP全然不同,应用程序产生的数据报长度将保持不变。由TCP传递给I P的信息单位称为报文段或段

    • 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。

      假设不能及时收到一个确认,将重发这个报文段。

    • 当TCP收到发自TCP连接还有一端的数据,它将发送一个确认。这个确认不是马上发送,通常将推迟几分之中的一个秒。
    • TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检測数据在传输过程中的不论什么变化。假设收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
    • 既然TCP报文段作为IP数据报来传输。而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。

      假设必要,TCP将对收到的数据进行又一次排序,将收到的数据以正确的顺序交给应用层。

    • 既然I P数据报会发生反复,TCP的接收端必须丢弃反复的数据。

    • TCP还能提供流量控制。

      TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端仅仅同意还有一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲
      区溢出。

      字节流:两个应用程序通过TCP连接交换8 bit字节构成的字节流。

        另外。TCP对字节流的内容不作不论什么解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符或者其它类型数据。对字节流的解释由TCP连接两方的应用层解释。

    TCP首部格式

      tcp数据是被封装在IP数据包中的,和udp相似,在IP数据包的数据部分。tcp数据包的格式例如以下:
      
      这里写图片描写叙述

      源port号和目的port号与udp中相似,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接,在网络编程中,一般一个IP地址和一个port号组合称为一个套接字(socket)。


      序号:用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。在tcp中tcp用序号对每一个字节进行计数(这个值与发送的帧数没有关系,而是与发送的数据字节数有关系,后面会有说明)。
      确认序号:包括发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加 1(不是单纯的序号加1,还包括数据字节数)。
      首部长度:用于记录tcp数据报首部的长度,一般为20字节,实际值为首部长度除以4。


      URG: 紧急指针( urgent pointer)有效。
      ACK: 确认序号有效。
      PSH: 接收方应该尽快将这个报文段交给应用层。
      RST: 重建连接。


      SYN: 同步序号用来发起一个连接。
      FIN: 发端完毕发送任务。


      窗体大小:用于流量控制。


      检验和:检验和覆盖了整个的 TCP报文段: TCP首部和TCP数据。与udp相似须要计算伪首部。

    Wireshark抓包分析TCP结构

      利用wireshark抓取一个tcp数据包,查看其详细数据结构和实际的数据:

    这里写图片描写叙述

    这里写图片描写叙述

    TCP连接的建立

      利用TCP数据传输前,须要建立tcp连接,tcp连接的建立有3个主要过程,叫做3次握手,详细步骤例如以下图所看到的:
      这里写图片描写叙述
     

    过程:
       1. 首先client发送一个SYN包给server(SYN=1,Seq为主机选择的这个连接的初始序号)。然后等待应答。


       2. server端收到SYN包,回应给client一个ACK =x+1、SYN=1的TCP数据段(ACK表示确认序号有效。即收到上一个包,这里加1并非ACK的值加1,ACK是一个标志位,这里会变成1,而x+1则是希望收到的下一个包的序列号。这个值放在包的确认序列号字段中,而仅仅有ACK=1时,确认序列号才有效)。
       3. 客户必须再次回应server端一个ACK确认数据段(这里的Seq为x+1)。
      
       经过上面3个过程就建立了一个tcp连接,接着就能够发送数据了,由于建立连接使用了一个序列号x,所以发送数据的第一个字节序号为x+1。
      
       注意:这里tcp为应用层提供全双工服务,意味数据能在两个方向上独立地进行传输,因此连接的每一段都有各自的数据传输序号(相应于上图中的x和y,这两个值是没有必定联系的)。


      
    Wireshark抓包分析TCP3次握手

      以下通过利用http应用层连接一个网络,实现tcp的3次握手和简单的数据交换过程,以下通过抓包来实际观察这个过程。首先我们先看看抓到的包:
      这里写图片描写叙述

      从第一行的tcp往下看,前面3个tcp包为3次握手的过程,接着http包说明成功建立连接。主机向server发送一个http应用请求,server收到请求后,返回一个tcp确认帧,接着发送一个http应答给主机,主机收到server的http应答数据后,又发送一个tcp确认帧,确认收到了数据。这样图中的前7个包实现了主机和server建立连接。并实现一次简单的数据请求应答过程。即下图所看到的的交互按键回显过程:

    这里写图片描写叙述

    接下来是依照顺序的7个数据帧的数据结构。数据帧顺序分别为:

      1. 主机发起一个tcp连接请求(tcp),
      2. server响应连接请求(tcp),
      3. 主机返回ACK完毕3次握手成功建立连接(tcp)。
      4. 主机发送一个http网页请求(http),
      5. server收到请求返回一个ACK帧(tcp)。
      6. server依据请求发送数据到主机(http)。
      7. 主机收到server数据返回一个ACK帧(tcp),详细帧细节见下图:

    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

    TCP连接的释放

      当通信两方完毕数据传输。须要进行TCP连接的释放。由于TCP连接是全双工的,因此每一个方向都必须单独进行关闭。这个原则是当一方完毕它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN仅仅意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。

    首先进行关闭的一方将运行主动关闭,而还有一方运行被动关闭。由于正常关闭过程须要发送4个TCP帧,因此这个过程也叫作4次挥手。详细步骤例如以下图:
      这里写图片描写叙述
      


    过程(默认client发起关闭):
      1. TCPclient发送一个FIN。关闭client到server端的数据传送。(client不再发送报文给server端,但可接受server端报文)
      2. server收到这个FIN,它发回一个ACK。确认序号为收到的序号加1。
      3.server关闭client的连接。发送一个FIN给client。

    (server端关闭到client的数据传送)
      4.客户段发回ACK报文确认,并将确认序号设置为收到序号加1。

    以下通过wireshark抓包了解详细的释放连接过程,通过断开一个连接。抓取到4个TCP帧,帧顺序依次为:

      1. 主动关闭放发送一个FIN帧给被动方
      2. 被动方收到关闭信息返回一个确认ACK帧
      3. 被动方发送一个FIN帧给主动方
      4. 主动方收到被动方的FIN关闭信息返回一个ACK帧。连接释放

    以下为依照顺序的帧数据结构详细信息:

    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

    TCP的最大报文段长度

      上面介绍了TCP连接的建立和释放过程,以下介绍一下TCP的最大报文段长度。


      最大报文段长度(MSS)表示TCP传往还有一端的最大块数据的长度。当一个连接建立时,连接的两方都要通告各自的MSS。一般来说,MSS越大越好,由于报文段越大同意每一个报文段传送的数据就越多,相对IP和TCP首部有更高的网络利用率。
      MSS选项仅仅能出如今SYN报文段中,所以仅仅能在SYN=1的帧中才会有MSS选项说明报文的最大段长度。
    详细參考:
    http://baike.baidu.com/link?

    url=c-fTckuehGMSiI5c2xCQDe3MUOKRwgdK6Q4CeO3tms8s6V3hIv5OmOQvUJvp67e90jUDAIjZfmhk8deiIjw1tK

    其它

      关于TCP的内容还有非常多。这里不再详细说明,可是须要知道,TCP连接的建立和释放还有几种比較特殊的情况,同一时候打开(SYN)建立连接,同一时候关闭或半关闭来释放连接的情况都是存在的。还有一些TCP的可选字段,这里都不再讲了,详细能够參考:TCP/IP 详细解释卷1。

  • 相关阅读:
    Storm并行度详解
    Storm 1.0 新特性
    Storm的本地运行模式示例
    Storm-6 Storm的并行度、Grouping策略以及消息可靠处理机制简介
    Strom-7 Storm Trident 详细介绍
    Storm入门教程 第五章 一致性事务【转】
    storm入门教程 第四章 消息的可靠处理【转】
    Storm入门教程 第三章Storm集群安装部署步骤、storm开发环境
    Storm 01之 Storm基本概念及第一个demo
    storm入门教程 第一章 前言[转]
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7205665.html
Copyright © 2011-2022 走看看