精华内容
下载资源
问答
  • TCP协议与UDP协议

    万次阅读 2019-02-19 19:30:54
    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中...

    概念理解

    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信!
    TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了。
    TCP/IP协议集包括应用层,传输层,网络层,网络访问层。
    其中应用层包括:
    超文本传输协议(HTTP):万维网的基本协议.
    文件传输(TFTP简单文件传输协议):
    远程登录(Telnet),提供远程访问其它主机功能,它允许用户登录
    internet主机,并在这台主机上执行命令.
    网络管理(SNMP简单网络管理协议),该协议提供了监控网络设备的方法,以及配置管理,统计信息收集,性能管理及安全管理等.
    域名系统(DNS),该系统用于在internet中将域名及其公共广播的网络节点转换成IP地址.
    其次网络层包括:
    Internet协议(IP)
    Internet控制信息协议(ICMP)
    地址解析协议(ARP)
    反向地址解析协议(RARP)
    最后说网络访问层:网络访问层又称作主机到网络层(host-to-network).网络访问层的功能包括IP地址与物理地址硬件的映射,以及将IP封装成帧.基于不同硬件类型的网络接口,网络访问层定义了和物理介质的连接.
    当然我这里说得不够完善,TCP/IP协议本来就是一门学问,每一个分支都是一个很复杂的流程,但我相信每位学习软件开发的同学都有必要去仔细了解一番。
    下面我着重讲解一下TCP协议和UDP协议的区别。

    在这里插入图片描述

    常用的熟知端口号

    应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL
    熟知端口 21,20 69 23 25 53 80 22 3306
    传输层协议 TCP UDP TCP TCP UDP TCP

    TCP(Transmission Control Protocol,传输控制协议)

    TCP的概述
    TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种断点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为192.3.4.16 而端口号为80,那么得到的套接字为192.3.4.16:80。

    TCP报文首部

    1. 源端口和目的端口,各占2个字节,分别写入源端口和目的端口;
    2. 序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;
    3. 确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701;
    4. 数据偏移,占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远;
    5. 保留,占6位,保留今后使用,但目前应都位0;
    6. 紧急URG,当URG=1,表明紧急指针字段有效。告诉系统此报文段中有紧急数据;
    7. 确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
    8. 推送PSH,当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;
    9. 复位RST,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
    10. 同步SYN,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
    11. 终止FIN,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;
    12. 窗口,占2字节,指的是通知接收方,发送本报文你需要有多大的空间来接受;
      13 .检验和,占2字节,校验首部和数据这两部分;
    13. 紧急指针,占2字节,指出本报文段中的紧急数据的字节数;
    14. 选项,长度可变,定义一些其他的可选的参数。

    是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,只简单的描述下这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

    TCP连接的建立(三次握手)

    在这里插入图片描述

    最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。
    
    1. TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
    2. TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时, TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
    3. TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
    4. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号
    5. 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。
      在这里插入图片描述

    为什么TCP客户端最后还要发送一次确认呢?

    一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
    如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

    如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

    TCP连接的释放(四次挥手)

    在这里插入图片描述

    数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
    
    1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
    2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
    3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
    4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
    5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
    6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
      在这里插入图片描述

    为什么客户端最后还要等待2MSL?

    MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。
    
    第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,
         我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,
         于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
    
    第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,
    	在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
    

    为什么建立连接是三次握手,关闭连接确是四次挥手呢?

    建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 
    而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,
    也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
    

    UDP(User Data Protocol,用户数据报协议)

    (1) UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
    (2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
    (3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
    (4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
    (5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。
    (6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
    我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。

    TCP与UDP的区别:

    1.基于连接与无连接;
    2.对系统资源的要求(TCP较多,UDP少);
    3.UDP程序结构较简单;
    4.流模式与数据报模式 ;
    5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

    其他链接
    TCP三次握手四次挥手详解
    TCP协议与UDP协议的区别

    展开全文
  • TCP 协议详解

    千次阅读 2017-09-13 16:19:06
    在笔者以前的工程中,用过 socket 套接字实现过多进程通信的程序,也用过 Node.js + socket.io + express 构建过 B/S 软件架构,但对最基础的 TCP 协议其实并没有透彻了解。适逢笔者最近找工作,为防面试时被面试官...

    TCP 协议详解

    在笔者以前的工程中,用过 socket 套接字实现过多进程通信的程序,也用过 Node.js + socket.io + express 构建过 B/S 软件架构,但对最基础的 TCP 协议其实并没有透彻了解。适逢笔者最近找工作,为防面试时被面试官问到相关问题惨遭打脸,笔者决定总结一下 TCP 协议的相关知识点。

    参考网址:
    《TCP 协议详解》
    《简析TCP的三次握手与四次分手》
    《TCP协议中的三次握手和四次挥手(图解)》
    《TCP通信的三次握手和四次撒手的详细流程(顿悟) 》
    《TCP建立连接的三次握手(例题)》

    一、TCP 协议功能简述

    在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。于是人们就想方设法的用电线把电脑连接到了一起。但是简单的连到一起是远远不够的,就好像语言不同的两个人互相见了面,完全不能交流信息。因而他们需要定义一些共通的东西来进行交流,TCP / IP 就是为此而生。
    TCP / IP 不是一个协议,而是一个协议族的统称。里面包括了 IP 协议,IMCP 协议,TCP 协议,以及我们更加熟悉的 http、ftp、pop3 协议等等。电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。


    # 二、TCP / IP 协议分层 网络结构有两种分层模式:OSI 参考模型与 TCP / IP 参考模型,两者虽然不同,但却有很多共通之处,如下所示:
    2964446-1fd7a0f3216c0530.jpg

    TCP / IP 协议按照层次由上到下,层层包装。TCP / IP 模型各层之间的基本作用如下:

    • 应用层:向用户提供一组常用的应用程序,如电子邮件(简单邮件传输协议,SMTP),文件传输访问(文件传输协议,FTP),远程登录(TELNET)等。
      • 远程登录 TELNET:使用 TELNET 协议,提供在网络其它主机上注册的接口,TELNET 会话提供了基于字符的虚拟终端;
      • 文件传输访问 FTP:使用 FTP 协议来提供网络内机器间的文件拷贝功能;
    • 传输层:即图中的运输层,负责提供应用程序间的通信。其功能包括:
      • 格式化信息流;
      • 提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。
    • 网络层:负责相邻计算机之间的通信。功能主要包括三方面:
      • 处理来自传输层的分组发送请求:收到请求之后,将分组装入 IP 数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口;
      • 处理输入数据报:首先检查其合法性,然后进行寻址:如果该数据包已经到达信宿机,则去掉报头,将剩下一部分交给适当的传输协议;如果该数据包尚未到达信宿机,则转发该数据报;
      • 处理路径、流控、拥塞等问题;
    • 网络接口层:这是 TCP / IP 的最底层,负责接收 IP 数据报并通过网络发送数据报,或者从网络上接收物理帧,抽出 IP 数据报,交给 IP 层;

    三、TCP 的可靠连接

    TCP 用于应用程序之间的可靠通信。
    当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求,这个请求必须被送到一个一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (Full-Duplex) 的通信,这个全双工通信将占用两个计算机之间的通信线路,直到它被一方(或双方)关闭为止。
    :UDP 和 TCP 很相似,当时更简单,同时可靠性低于 TCP。


    # 四、TCP 报文格式 TCP 是一个协议,那这个协议是如何定义的,它的数据格式是什么样子的呢?要进行更深层次的剖析,就需要了解,甚至是熟记 TCP 协议中每个字段的含义。下图就是 TCP 协议的报文格式,由于报文格式是理解其它内容的基础,十分重要,所以将对每个字段的信息详细说明:
    jellythinkTCP3.jpg
    • Source Port, Destination Port(源端口号,目的端口号):分别占用 16 位,用于区别主机中的不同进程;由于 IP 地址用来区分不同主机,所以源端口号、目的端口号与 IP 首部中的源 IP 地址和目的 IP 地址,技能确定唯一的一个 TCP 连接;
    • Sequence Number(发送序号):32 位数据,用来标识从 TCP 发送端向 TCP 接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节在数据流中的序号,主要用来解决网络报乱序问题;
    • Acknowledgment Number(确认序号):占用 32 位,由接收端的计算机使用,将分段的报文重组成最初形式;如果设置了控制位 ACK = 1,则这个值表示下一个准备接受的包的序列码;
    • Offset(数据偏移量):占用 4 位,给出首部中 32bit 字的数目,需要这个值是因为任选字段的长度是可变的(如果没有任选字段,正常的长度是 20 字节);
    • Reserved(保留位):占用 6 位,且必须是 0,为了将来定义新的用途而保留;
    • TCP Flags(TCP 标志位):用于标志 TCP 的某些状态,它们中的多个可同时被设置为 1,主要用于操控 TCP 的状态机,6 个标志位依次为 URG, ACK, PSH, RST, SYN, FIN。每个标志位的意义如下:
      • URG:紧急标志 (Urgent),该标志表示 TCP 包的紧急指针域有效(后面将会说到紧急指针域的内容),用来保证 TCP 连接不被中断,并督促中间层设备要尽快处理这些数据;
      • ACK:确认标志 (Acknowledge),该标志表示应答域有效,就是说前面提到的 TCP 应答信号会包含在 TCP 数据包中;ACK 可以由两个取值( 0/1 ):应答域有效为1,反之为0;
      • PSH:推标志 (Push),表示 Push 操作,即在数据报到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队;
      • RST:复位标志 (Reset),用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据报;
      • SYN:同步标志 (Synchronize),用来建立连接。该标志经常与 ACK 标志搭配使用:
        • 连接请求时,SYN = 1, ACK = 0;
        • 连接被响应时,SYN = 1, ACK = 1;
        • SYN 的数据报经常被用来进行端口扫描,扫描这发送一个只有 SYN 的数据包,此时若对方主机相应了一个数据包回来,就表明这台主机存在该端口;
        • 这种扫描方式只是进行 TCP 三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器并不安全,一台安全的主机将会强制要求一个连接严格的进行 TCP 三次握手;
      • FIN:结束标志 (Finish),表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描;
    • Window(窗口大小):用来进行流量控制(问题比较复杂,本博文中并不总结);

    五、TCP 的三次握手

    ## 1. 三次握手详解 TCP 是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在 TCP / IP 协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的。 三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。这就是面试中经常会被问到的 TCP 三次握手。解释如下图:
    jellythinkTCP4.jpg
    • 第一次握手:建立连接。首先客户端发送连接请求报文段,将同步位 SYN 置为 1,发送序号 (Sequence Number) 置为 x;然后客户端进入 SYN_SEND 状态,等待服务器确认;
    • 第二次握手:服务器收到 SYN 报文段。服务器收到了客户端发送的 SYN 报文段,对该 SYN 报文段进行确认,设置确认标志 Acknowlegde Number 为 x + 1(即发送序号 Sequence Number + 1);同时服务器自己还要发送 SYN 请求信息,将 SYN 置为 1,发送序号 Sequence Number 为 y;服务器端将上述所有信息放到一个报文段(即 SYN + ACK 报文段)中,一并发给客户端;此时服务器进入 SYN_RECV 状态;
    • 第三次握手:客户端收到服务器的 SYN + ACK 报文段,然后将确认序号 Acknowledgment Number 设置为 y+1,向服务器发送 ACK 报文段,这个报文段发送完毕后,客户端与服务器端都进入了 ESTABLISHED 状态,此时便完成了 TCP 三次握手;

    完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。

    2. 为什么要进行三次握手?

    既然总结了TCP的三次握手,那为什么非要三次呢?怎么觉得两次就可以完成了。那TCP为什么非要进行三次连接呢?在谢希仁的《计算机网络》中是这样说的:

    为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

    同时,书中举了一个例子如下:

    “已失效的连接请求报文段”的产生在这样一种情况下:客户端发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达服务器。本来这是一个早已失效的报文段,但服务器收到此失效的连接请求报文段后,就误认为是客户端再次发出的一个新的连接请求。于是就向客户端发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要服务器发出确认,新的连接就建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务器的确认,也不会向服务器发送数据。但服务器却以为新的运输连接已经建立,并一直等待客户端发来数据。这样,服务器的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,客户端不会向服务器的确认发出确认。服务器由于收不到确认,就知道客户端并没有要求建立连接。”

    这样讲就很明白了,防止了服务器端的一直等待而浪费资源。


    # 六、TCP 的三次握手实例讲解 例1:实例如下: > IP 192.168.1.116.3337 –> 192.168.1.123.7788: S 3626544836:3626544836 > IP 192.168.1.123.7788 –> 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837 > IP 192.168.1.116.3337 –> 192.168.1.123.7788: ack 1739326487,ack 1 - 第一次握手:192.168.1.116 发送位码 SYN = 1,随机产生发送序列号Sequence Number = 3626544836 的数据包,并发送到 IP 为 192.168.1.123 的地址,192.168.1.123 由 SYN = 1 知道 192.168.1.116 要求建立联机; - 第二次握手:192.168.1.123 收到请求后要确认联机信息,向 192.168.1.116 确认序列号 (Acknowledge Number) ACK = 3626544837, SYN = 1, ACK = 1,随机产生发送序列号seq = 1739326486 的包; - 第三次握手:192.168.1.116 收到后检查第二次握手中收到的确认序列号 (ACK = 3626544837) 是否正确,即是否等于第一次发送的发送序列号 Sequence Number + 1 (3626544836 + 1),以及位码 ACK 是否为 1,若正确,192.168.1.116 会再发送确认序列号 Acknowledge Number = 1739326487, ACK = 1,192.168.1.123 收到后确认 seq = seq + 1, ack = 1,则连接建立成功。 用网络抓包分析工具 WireShark 可以分析上述过程如下面两图所示:
    r_1.jpg
    r_2.jpg

    第一次握手的标志位如下图所示:

    r_3.jpg

    我们看到标志位中只有一个同步位为 1,也就是说此时在做请求 (SYN);

    第二次握手的标志位如下图所示:

    r_4.jpg

    我们可以看到,标志位里只有确认位和同步位,也就是正在做应答(SYN + ACK);

    第三次握手的标志位如下图所示:

    r_5.jpg

    我们可以看到,标志位里只有一个确认位,也就是正在做再次确认 (ACK);

    故可以得知:一次完整的三次握手,就是请求 -> 应答 -> 再次确认;

    例2,有题如下:

    TCP建立连接的过程采用三次握手,已知第三次握手报文的发送序列号为 1000,确认序列号为 2000,请问第二次握手报文的发送序列号和确认序列号分别为
    A. 1999,999
    B. 1999,1000
    C. 999,2000
    D. 999,1999

    答案应该选 B:发送序列 (Sequence Number)是自己发送报文的序列号,当前发送序列号是上一次发送序列号 +1,确认序列号 (Acknowledge Number) 是从对方接收到的发送序列号 +1。第三次握手发送的序列号(即 seq number = x+1)是 1000,那说明第一次握手发送的序列号(即seq number = x)是 999。
    注意:这里是握手,因此,第二次握手的确认序列号是 1000,即第二次握手的确认序列号是第一次握手时从对方接收到的发送序列号(即上文中推出来的999)+1。第三次握手发送的确认号是 2000,说明第二次握手的发送序列号是 1999。所以选 B。

    七、TCP 的四次分手

    1. 四次分手详解

    在客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定总要断开 TCP 连接。那对于 TCP 的断开连接,这里就有了对应的“四次分手”。

    • 第一次分手:主机 1(可以是客户端,也可以是服务器端),设置发送序列号 (Sequence Number) 和确认序列号 (Acknowledgment Number),向主机 2 发送一个 FIN 报文段;这时候,主机 1 进入 FIN_WAIT_1 状态;这表示主机 1 没有数据要发送给主机 2 了;
    • 第二次分手:主机 2(收到了主机 1 发送的 FIN 报文段,向主机 1 回一个 ACK 报文段,此时确认序列号 (Acknowledge Number) 设置为第一次分手阶段中的发送序列号 (Sequence Number) 的值 + 1;主机 1 进入 FIN_WAIT_2 状态;主机 2 告诉主机 1:“我同意你的关闭请求”;
    • 第三次分手:主机 2 向主机 1 发送 FIN 报文段,请求关闭连接,同时主机 2 进入 LAST_ACK 状态;
    • 第四次分手:主机 1 收到主机 2 发送的 FIN 报文段,然后主机 1 进入 TIME_WAIT 状态;主机 2 收到主机 1 的 ACK 报文段之后,就关闭连接;此时主机 1 等待 2MSL(最大报文段生存时间)后依然没有收到回复,则证明服务器端已经正常关闭,这时候主机 1 也可以关闭连接了。

    这次 TCP 的四次分手就这么完成了。

    2. 为什么要四次分手?

    四次分手是为何呢?如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。

    • FIN_WAIT_1(主动方):该状态需要好好解释一下。其实 FIN_WAIT_1 和 FIN_WAIT_2 状态的真正含义,都是表示等待对方的 FIN 报文,而这两种状态的区别是:FIN_WAIT_1 状态实际上是 socket 在 ESTABLISHED 状态时,它想主动关闭连接,向对方发送了 FIN 报文,此时该 socket 进入到了 FIN_WAIT_1 状态;而当对方回应 ACK 报文后,则进入到 FIN_WAIT_2 状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应 ACK 报文,所以 FIN_WAIT_1 状态一般都比较难见到,而 FIN_WAIT_2 状态还可以时常用 netstat 看到;
    • FIN_WAIT_2(主动方):上面已经详细解释了这种状态,实际上 FIN_WAIT_2 状态下的 socket 表示半连接,即由一方要求关闭连接,但同时还告诉对方,我暂时还有一点数据需要传送给你 (ACK),稍后再关闭连接;
    • CLOSE_WAIT(被动方):这种状态含义其实是表示等待关闭。当对方关闭一个 socket 后,对方会发送一个 socket 给自己,此时系统必然会回应一个 ACK 报文给对方,此时进入到 CLOSE_WAIT 状态。接下来,实际上你真正需要考虑的事情是查看你是否还有数据发送给对方。如果没有的话,就可以关闭这个 socket,发送 FIN 报文给对方,即关闭了连接。所以在 CLOSE_WAIT 状态下,需要完成的事情是等待你去关闭连接;
    • LAST_ACK(被动方):被动关闭一方发送 FIN 报文后,最后等待对方的 ACK 报文;当收到 ACK 报文后,也就可以进入到 CLOSED 可用状态了;
    • TIME_WAIT(主动方):表示收到了对方的 FIN 报文,并发送出了 ACK 报文,就等 2MSL 后就可回到 CLOSED 可用状态了。如果 FIN_WAIT_1 状态下,收到了对方同时带 FIN 标志和 ACK 标志的报文时,就可以直接进入到 TIME_WAIT 状态,而无须经过 FIN_WAIT_2 状态;
    • CLOSED:表示连接中断;

    八、后记

    基本上介绍到这里就结束了,但 TCP 协议还是比较复杂的,需要好好理解。
    希望这次总结可以让笔者对 TCP 协议更加深入了解,而且能够在以后的某不知何时何地的面试中过关斩将吧~

    展开全文
  • ModbusTCP协议

    千次阅读 2020-09-07 10:49:42
    1.Tcp ModBus相对串行链路ModBus,去掉了从机地址、校验码,因为底层的TCP协议确保了端到端的连接,Tcp协议的校验也可确保传输数据的准确性。 2.Tcp ModBus增加了MBAP报文头,如下图: 传输标识 传输标识用于将...

     1.Tcp ModBus相对串行链路ModBus,去掉了从机地址、校验码,因为底层的TCP协议确保了端到端的连接,Tcp协议的校验也可确保传输数据的准确性。

        2.Tcp ModBus增加了MBAP报文头,如下图:

    传输标识
    传输标识用于将请求与未来响应之间建立联系。因此,对TCP 连接来说,在同一时刻,这个标识符必须是唯一的。有几种使用此标识符的方式:
    - 例如:可以作为一个带有计数器的简单“TCP顺序号”,在每一个请求时增加计数器;
    - 也可以用作智能索引或指针,来识别事务处理的内容,以便记忆当前的远端服务器和未处理的请求。
    服务器收接受的请求数量取决于其容量,即:服务器资源量和TCP 窗口尺寸。同样,客户机同时启动事务处理的数量也取决于客户机的资源容量。这个实现参数称为“NnmberMaxofClientTransaction”,必须作为MODBUS 客户机的一个特性进行描述。根据设备的类型,此参数取值为1~16。


     单元标识符
    在MODBUS或MODBUS+串行链路子网中对设备进行寻址时,这个域是用于路由的目的。在这种情况下,“Unit Identifier”携带一个远端设备的MODBUS从站地址:
    - 如果MODBUS服务器连接到MODBUS+或MODBUS串行链路子网,并通过一个桥或网关配置地址这个服务器,MODBUS单元标识符对识别连接到网桥或网关后的子网的从站设备是必需的。目的IP地址识别了网桥本身的地址,而网桥则使用MODBUS单元标识符将请求转交给正确的从站设备。
    - 分配串行链路上MODBUS从站设备地址为1~247(10进制),地址0作为广播地址。
    对TCP/IP 来说,利用IP 地址寻址MODBUS 服务器;因此,MODBUS 单元标识符是无用的。必需使用值0xFF。
    - 当对直接连接到TCP/IP网络上的MODBUS服务器寻址时,建议不要在“单元标识符”域使用有效的MODBUS从站地址。在一个自动系统中重新分配IP地址的情况下,并且如果以前分配的MODBUS服务器的IP地址又被指配给网关,使用一个有效的从站地址可能会由于网关的路由不畅而引起麻烦。使用无效的从站地址,网关仅是简单地废弃MODBUD PDU,而不会有任何问题。建议:在采用0xFF作为“单元标识符”的无效值。
    注:0也可以用作与MODBUS/TCP设备直接通信。

     

    3.TCP ModBus客户端是否必须是TCP客户端?这个目前暂未搞清楚。 疑惑 

    如果要我设计,TCP ModBus的客户端既可以是TCP的客户端,也可以是TCP服务器端,TCP协议只负责连接的建立与管理,TCP ModBus协议负责具体的数据通讯。在我的项目中,这样做也是最可靠的,实现起来也容易。即:PLC作为TCP客户端,上位机作为TCP服务器端,由PLC发起请求建立连接,TCP连接建立后,PLC作为TCP ModBus的服务器端(ModBus从机),上位机作为客户端(ModBus主机),由上位机按TCP ModBus协议读写PLC的相关寄存器、开关量。

    而按照ModBus协议的描述,貌似TCP ModBus客户端必须是TCP客户端。

     

    原文链接:https://blog.csdn.net/iknow_nothing/article/details/84292914

    视频地址:https://www.bilibili.com/video/BV1cz4y1R7cg

    简介

    Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP

    Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。

    标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

    ModbusTCP数据帧

    ModbusTCP的数据帧可分为两部分:MBAP+PDU

    报文头MBAP

    MBAP为报文头,长度为7字节,组成如下:

    事务处理标识 协议标识 长度 单元标识符
    2字节 2字节 2字节 1字节

     

    内容 解释
    事务处理标识 可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。
    协议标识符 00 00表示ModbusTCP协议。
    长度 表示接下来的数据长度,单位为字节。
    单元标识符 可以理解为设备地址。

    帧结构PDU

    PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。

    功能码

    Modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器。

    对象 含义
    线圈 PLC的输出位,开关量,在Modbus中可读可写
    离散量 PLC的输入位,开关量,在Modbus中只读
    输入寄存器 PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读
    保持寄存器 PLC中用于输出模拟量信号的寄存器,在Modbus中可读可写

    根据对象的不同,Modbus的功能码有:

    功能码 含义
    0x01 读线圈
    0x05 写单个线圈
    0x0F 写多个线圈
    0x02 读离散量输入
    0x04 读输入寄存器
    0x03 读保持寄存器
    0x06 写单个保持寄存器
    0x10 写多个保持寄存器

    说明更详细的表

    代码 中文名称 英文名 位操作/字操作 操作数量
    01 读线圈状态 READ COIL STATUS 位操作 单个或多个
    02 读离散输入状态 READ INPUT STATUS 位操作 单个或多个
    03 读保持寄存器 READ HOLDING REGISTER 字操作 单个或多个
    04 读输入寄存器 READ INPUT REGISTER 字操作 单个或多个
    05 写线圈状态 WRITE SINGLE COIL 位操作 单个
    06 写单个保持寄存器 WRITE SINGLE REGISTER 字操作 单个
    15 写多个线圈 WRITE MULTIPLE COIL 位操作 多个
    16 写多个保持寄存器 WRITE MULTIPLE REGISTER 字操作 多个

    PDU详细结构

    0x01:读线圈

    在从站中读1~2000个连续线圈状态,ON=1,OFF=0

    • 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
    • 响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)
    • 如:在从站0x01中,读取开始地址为0x0002的线圈数据,读0x0008位
      00 01 00 00 00 06 01 01 00 02 00 08
    • 回:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF
      00 01 00 00 00 04 01 01 01 01

    0x05:写单个线圈

    将从站中的一个输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF

    • 请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
    • 响应:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
    • 如:将地址为0x0003的线圈设为ON
      00 01 00 00 00 06 01 05 00 03 FF 00
    • 回:写入成功
      00 01 00 00 00 06 01 05 00 03 FF 00

    0x0F:写多个线圈

    将一个从站中的一个线圈序列的每个线圈都强制为ON或OFF,数据域中置1的位请求相应输出位ON,置0的位请求响应输出为OFF

    • 请求:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L 字节长度 输出值H 输出值L
    • 响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L

    0x02:读离散量输入

    从一个从站中读1~2000个连续的离散量输入状态

    • 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
    • 响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))
    • 如:从地址0x0000开始读0x0012个离散量输入
      00 01 00 00 00 06 01 02 00 00 00 12
    • 回:数据长度为0x03个字节,数据为0x01 04 00,表示第一个离散量输入和第11个离散量输入为ON,其余为OFF
      00 01 00 00 00 06 01 02 03 01 04 00

    0x04:读输入寄存器

    从一个远程设备中读1~2000个连续输入寄存器

    • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
    • 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
    • 如:读起始地址为0x0002,数量为0x0005的寄存器数据
      00 01 00 00 00 06 01 04 00 02 00 05
    • 回:数据长度为0x0A,第一个寄存器的数据为0x0c,其余为0x00
      00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00

    0x03:读保持寄存器

    从远程设备中读保持寄存器连续块的内容

    • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
    • 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
    • 如:起始地址是0x0000,寄存器数量是 0x0003
      00 01 00 00 00 06 01 03 00 00 00 03
    • 回:数据长度为0x06,第一个寄存器的数据为0x21,其余为0x00
      00 01 00 00 00 09 01 03 06 00 21 00 00 00 00

    0x06:写单个保持寄存器

    在一个远程设备中写一个保持寄存器

    • 请求:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
    • 响应:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
    • 如:向地址是0x0000的寄存器写入数据0x000A
      00 01 00 00 00 06 01 06 00 00 00 0A
    • 回:写入成功
      00 01 00 00 00 06 01 06 00 00 00 0A

    0x10:写多个保持寄存器

    在一个远程设备中写连续寄存器块(1~123个寄存器)

    • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2)
    • 响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
    • 如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F
      00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
    • 回:写入成功
      00 01 00 00 00 06 01 10 00 00 00 01

    Modbus TCP 示例报文

    原文链接:https://blog.csdn.net/mikasoi/article/details/81782159

    ModBusTcp与串行链路Modbus的数据域是一致的,具体数据域可以参考串行Modbus。这里给出几个ModbusTcp的链路解析说明,辅助新人分析报文。

    ModbusTCP通信

    通信方式

    Modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用TCP通信时,主站为client端,主动建立连接;从站为server端,等待连接。

    • 主站请求:功能码+数据
    • 从站正常响应:请求功能码+响应数据
    • 从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型
    • 注意:需要超时管理机制,避免无期限的等待可能不出现的应答

    IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。

    通信过程

    1. connect 建立TCP连接
    2. 准备Modbus报文
    3. 使用send命令发送报文
    4. 在同一连接下等待应答
    5. 使用recv命令读取报文,完成一次数据交换
    6. 通信任务结束时,关闭TCP连接

    仿真软件

    • Modbus poll 和Modbus slave是一组Modbus仿真软件,可以实现Modbus RTU、TCP、串口仿真等。
    • 仿真软件网址:https://modbustools.com/download.html
    • 在ModbusTCP中,Modbus poll 作为客户端请求数据,Modbus slave 作为服务器端处理请求。
    • 使用c语言编写客户端连接Modbus slave时,注意数据格式,一条指令一次性发出,否则连接会出错。
    • 使用软件时,需要指定功能码,在setup->slave definition或者poll definition中进行设置。
      – slave ID:从站编号(事务标识符)
      – function:功能码,0x01对应线圈操作,0x02对应离散量操作,0x03对应保持寄存器操作,0x04对应输入寄存器操作
      – address:开始地址
      – quantity:寄存器/线圈/离散量 的数量

    参考:
    https://wenku.baidu.com/view/c2a9e1cc376baf1ffd4fad5c.html
    https://blog.csdn.net/zwxue251/article/details/24154951
    https://blog.csdn.net/lakerszhy/article/details/68927178?locationNum=4&fps=1

    一些概念

    原文链接:https://wenku.baidu.com/view/55595d0690c69ec3d5bb75ed.html

    在工业自动化控制中,经常会遇到开关量,数字量,模拟量,离散量,脉冲量等各种概念,而人们在实际应用中,对于这些概念又很容易混淆。现将各种概念罗列如下:

    1.开关量:

    一般指的是触点的“开”与“关”的状态,一般在计算机设备中也会用“0”或“1”来表示开关量的状态。开关量分为有源开关量信号和无源开关量信号,有源开关量信号指的是“开”与“关”的状态是带电源的信号,专业叫法为跃阶信号,可以理解为脉冲量,一般的都有220VAC, 110VAC,24VDC,12VDC等信号,无源开关量信号指的是“开”和“关”的状态时不带电源的信号,一般又称之为干接点。电阻测试法为电阻0或无穷大。

    2.数字量:

    很多人会将数字量与开关量混淆,也将其与模拟量混淆。数字量在时间和数量上都是离散的物理量,其表示的信号则为数字信号。数字量是由0和1组成的信号,经过编码形成有规律的信号,量化后的模拟量就是数字量。

    3.模拟量:

    模拟量的概念与数字量相对应,但是经过量化之后又可以转化为数字量。模拟量是在时间和数量上都是连续的物理量,其表示的信号则为模拟信号。模拟量在连续的变化过程中任何一个取值都是一个具体有意义的物理量,如温度,电压,电流等。

    4.离散量:

    离散量是将模拟量离散化之后得到的物理量。即任何仪器设备对于模拟量都不可能有个完全精确的表示,因为他们都有一个采样周期,在该采样周期内,其物理量的数值都是不变的,而实际上的模拟量则是变化的。这样就将模拟量离散化,成为了离散量。

    5.脉冲量:

    脉冲量就是瞬间电压或电流由某一值跃变到另一值的信号量。在量化后,其变化持续有规律就是数字量,如果其由0变成某一固定值并保持不变,其就是开关量。

    综上所述,模拟量就是在某个过程中时间和数量连续变化的物理量,由于在实际的应用中,所有的仪器设备对于外界数据的采集都有一个采样周期,其采集的数据只有在下一个采样周期开始时才有变动,采样周期内其数值并不随模拟量的变化而变动。
    这样就将模拟量离散化了,例如:某设备的采样周期为1秒,其在第五秒的时间采集的温度为35度,而第六秒的温度为36度,该设备就只能标称第五秒时间温度35度,第六秒时间温度36度,而第五点五秒的时间其标称也只是35度,但是其实际的模拟量是35.5度。这样就将模拟信号离散化。其采集的数据就是离散化了,不再是连续的模拟量信号。
    由于计算机只识别0和1两个信号,即开关量信号,用其来表示数值都是使用数字串来表示,由于计算能力的问题,其数字串不能无限长,即其表达的精度也是有限的,同样的以温度为例,由于数字串限制,其表达温度的精度只能达到0.1度,小于该单位的数值则不能被标称,这样就必须将离散量进行量化,将其变为数字量。即35.68度的温度则表示为35.6度。

    展开全文
  • TCP协议大全

    千次阅读 2018-08-21 16:22:53
    TCP协议笔记 上一篇文章已经讲过啦TCP/IP协议族了,大概多TCP协议有了大概的了解。 在网页中HTTP请求获取内容之前是需要先建立TCP连接的,而TCP建立连接需要三次握手,该篇文章将讲解TCP的工作原理。 TCP特性 ...

    Date: 2017-01-02 10:10:11

    TCP协议笔记

    上一篇文章已经讲过啦TCP/IP协议族了,大概多TCP协议有了大概的了解。
    在网页中HTTP请求获取内容之前是需要先建立TCP连接的,而TCP建立连接需要三次握手,该篇文章将讲解TCP的工作原理。

    TCP特性

    • TCP提供一种面向连接的、可靠的字节流服务
    • 在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP
    • TCP使用校验和,确认和重传机制来保证可靠传输
    • TCP给数据分节进行排序,并使用累积确认保证数据的顺序不变和非重复
    • TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制

    注意:TCP 并不能保证数据一定会被对方接收到,因为这是不可能的。TCP 能够做到的是,如果有可能,就把数据递送到接收方,否则就(通过放弃重传并且中断连接这一手段)通知用户。因此准确说 TCP 也不是 100% 可靠的协议,它所能提供的是数据的可靠递送或故障的可靠通知。

    TCP三次握手连接

    所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。
    三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。

    1. 客户端向服务器发送SYN报文(Seq=x, SYN=1),客户端进去SYN_SENT状态
    2. 服务器收到客户端的请求,向客户端回复一个确认信息(Ack = x + 1)和 一个SYN包(seq=y)建立连接请求,此时服务器进去SYN_RECV状态
    3. 客户端收到服务器的回复(SYN+ACK报文),向服务器端发送ACK,此包发送完毕后客户端和服务器端进入ESTABLISHED状态

    先看一下TCP的头部

    第一次握手

    第二次握手

    第三次握手

    为什么要三次握手而不是二次

    重点:主要目的防止server端一直等待,浪费资源

    1. 三次握手的目的是同步连接双方的序列号和确认号并交换TCP窗口大小信息。
    2. 两次握手可能因为丢包而出现死锁。

    客户端C发送请求,服务端S应答并分配资源(资源:由于不需要再次确认,这个时候服务端就会返回http请求的结果)。
    若S的应答没有到达C端,C认为连接未建立,而S认为建立了,S会在一段时间内保留分配的资源
    如果大量C这样请求,S会崩溃。

    注意:TCP握手之后,服务端接下来是要返回客户端的请求资源哦。如果在两次握手中,客户端不断的请求,就会导致服务端大量资源的量费。

    TCP四次挥手断开

    1. 客户端A发送位码为FIN=1,用来关闭客户A到服务器B的数据传送。此时A的状态为FIN_WAIT_1
    2. 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。此时A为FIN_WAIT_2,B为CLOSE_WAIT
    3. 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。此时A为TIME_WAIT,B为LAST_ACK
    4. 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。此时A、B都关闭了,状态变为CLOSED。
      说明:关闭分为两部分,客户端发器关闭,服务端响应;服务端发器关闭,客户端响应。

    注意: 2,3阶段可以一起发送哦,如果2,3阶段一起发送,客户端A直接进入到TIME_WAIT状态,无须进入FIN_WAIT_2。
    2,3阶段分别发送的是ACK,FIN,如果服务端还有未传输完毕的数据就单独发送一个ACK应答客户端发送过来的FIN;等待传送完毕再发送一个FIN告诉客户段A服务端B也可以断开连接了。但是如果服务端在接受到客户端A的FIN时,已经传送完毕数据了,那就可以ACK,FIN一起发送了,没必要让客户端A进入FIN_WAIT2等候了。参考文献

    图中有个TIME_WAIT是干什么的?
    持续时间未2MSL,一个数据包在网络中的最长生存时间为MSL 。 假设最后客户端回复的ACK丢失,服务器端会在超时时间到来时,重传最后一个FIN包。
    ACK和FIN在网络中的最长生存时间就为2MSL,这样就可以可靠的断开TCP的双向连接。

    MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。

    为什么建立连接需要三次握手,而断开连接需要四次握手

    为什么需要三次握手?
    为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
    client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。(和上面的例子差不多,两种不同的场景,都是客户端收不到或者不需要的情况下服务端还发送资源)

    为什么需要四次连接断开?
    因为客户端和服务端都需要一个FIN和ACK,当客户端发送了FIN包之后,处于半关闭状态,此时仍然可以接收数据包。
    在断开连接时,如果服务端收到FIN包,但此时仍有数据未发送完,此时就需要先向客户端回复ACK,告诉客户端我已经收到你的请求了。等到将剩下的数据都发送完之后,再向客户端发送FIN,断开发送方向的连接,因此很多时候FIN和ACK需要在两个数据包中发送,因此需要四次握手。

    超时重传和快速重传

    超时重传:当超时时间到达时,发送方还未收到对端的ACK确认,就重传该数据包。
    快速重传:当后面的序号先到达,如接收方接收到了1、 3、 4,而2没有收到,接收方就会立即向发送方重复发送三次ACK=2的确认请求重传。如果发送方连续收到3个相同序号的ACK,就重传该数据包,而不用等待超时。

    TCP之SYN攻击

    在三次握手过程中,服务器发送 SYN-ACK 之后,收到客户端的 ACK 之前的 TCP 连接称为半连接(half-open connect)。此时服务器处于 SYN_RCVD 状态。当收到 ACK 后,服务器才能转入 ESTABLISHED 状态.

    SYN 攻击指的是,攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认。由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击。

    在 Linux/Unix 上可以使用系统自带的 netstats 命令来检测 SYN 攻击。

    防范措施:
    1、降低SYN timeout时间,使得主机尽快释放半连接的占用
    2、采用SYN cookie设置,如果短时间内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击,丢弃来自该IP的后续请求报文
    3、在网关处设置过滤,拒绝将一个源IP地址不属于其来源子网的包进行更远的路由

    TCP与UDP的区别

    • TCP是有连接的,两台主机在进行数据交互之前必须先通过三次握手建立连接;而UDP是无连接的,没有建立连接这个过程
    • TCP是可靠的传输,TCP协议通过确认和重传机制来保证数据传输的可靠性;而UDP是不可靠的传输
    • TCP还提供了拥塞控制、滑动窗口等机制来保证传输的质量,而UDP都没有
    • TCP是基于字节流的,将数据看做无结构的字节流进行传输,当应用程序交给TCP的数据长度太长,超过MSS时,TCP就会对数据进行分段,因此TCP的数据是无边界的;而UDP是面向报文的,无论应用程序交给UDP层多长的报文,UDP都不会对数据报进行任何拆分等处理,因此UDP保留了应用层数据的边界

    基于TCP协议与UDP协议

    • TCP: FTP、HTTP、Telnet、SMTP、POP3、HTTPS
    • UDP:DNS、SNMP、NFS

    TCP窗口滑动以及拥塞控制

    TCP协议在工作时,如果发送端的TCP协议软件每传输一个数据分组后,必须等待接收端的确认才能够发送下一个分组,由于网络传输的时延,将有大量时间被用于等待确认,导致传输效率低下。为此TCP在进行数据传输时使用了滑动窗口机制。
    TCP滑动窗口用来暂存两台计算机间要传送的数据分组。每台运行TCP协议的计算机有两个滑动窗口:一个用于数据发送,另一个用于数据接收。发送端待发数据分组在缓冲区排队等待送出。被滑动窗口框入的分组,是可以在未收到接收确认的情况下多送出的部分。滑动窗口左端标志X的分组,是已经被接收端确认收到的分组。随着新的确认到来,窗口不断向右滑动。
    TCP协议软件依靠滑动窗口机制解决传输效率流量控制问题。

    这部分没法模拟,所以只能复制粘贴。详情查看解说

    参考文章

    https://hit-alibaba.github.io/interview/basic/network/TCP.html
    http://blog.csdn.net/u012658346/article/details/51192944
    http://www.cnblogs.com/wulala1119/p/4749892.html
    http://blog.csdn.net/longwang155069/article/details/50058779

    展开全文
  • MQTT 是 IBM 于 1998 年设计和开发的工作在 TCP/IP 协议簇上是基于 TCP 协议的应用层协议。MQTT 采用轻量级的发布/订阅范式进行消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务,设备...
  • TCP协议解析

    千次阅读 2018-01-19 09:25:06
    TCP协议解析   TCP是一个巨复杂的协议,因为它要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。关于TCP这个协议的细节,...
  • 2,Tcp协议对应于传输层 3,http协议是在Tcp协议之上建立的,http在发起请求时通过tcp协议建立起连接服务器的通道,请求结束后,立即断开tcp连接 说明:从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单...
  • TCP协议疑难杂症全景解析

    万次阅读 多人点赞 2011-07-17 19:28:21
    本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人。因为本文不会解析TCP头里面...
  • wireshark 抓包分析 TCP协议

    千次阅读 2019-03-22 18:45:21
    TCP协议 在Filter中设置为:ip.dst == 222.199.191.33 or ip.src == 222.199.191.33 这个地址是干什么的不知道,只是跟它的交互特别多,就选他了。 分析第一个包: 源地址:我自己电脑的IP,就不放上来了 ...
  • ModbusTCP协议学习笔记

    万次阅读 多人点赞 2018-11-20 12:00:10
    这篇在简书发过一次,增加了一点内容,尝试一下用CSDN ...Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。 标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口...
  • TCP协议与UDP协议的区别

    千次阅读 2017-05-04 16:47:01
    TCP/IP协议是一个协议簇。里面包括很多协议。UDP是其中的一个。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了。 转自: http://zhangjiangxing-gmail-com.iteye.com/blog/646880 ...
  • HTTP协议TCP 协议

    千次阅读 2010-08-22 15:12:00
    HTTP...HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响
  • Http协议与TCP协议简单理解后续

    万次阅读 多人点赞 2016-09-05 08:58:52
    大约2年前写了一篇关于HTTP协议与TCP协议的文章,原文链接。最近再次简单读了一遍《TCP/IP协议卷》,有了一些新的理解。这篇文章没有一个很好的连贯性,都是我在读书过程中总结的知识点,整体比较松散,但是个人感觉...
  • TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供可靠性通信(即数据无误,数据无丢失,数据无失序,数据无重复到达的通信)
  • [面试]TCP协议-HTTP协议-HTTPS协议经典面试题

    万次阅读 多人点赞 2017-11-11 17:56:04
    http请求由三部分组成,分别是:请求行、消息报头、请求正文HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的...
  • tcp协议的man手册
  • Android 开发 TCP协议

    千次阅读 2018-01-11 11:42:17
    4.TCP协议: 4.1定义:TCP传输控制协议,是一种传输层的通信协议; 特点: 面向连接:使用TCP传输数据之前先建立连接,传输完成后释放链接。类似打电话,拨号,接通,交流,挂机; 全双工通信:一旦...
  • TCP协议疑难杂症全景分析

    千次阅读 2015-12-30 10:53:40
    本文以TCP的发展历程解析容易引起混淆,误会的方方面面 2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的 3).针对对象:对TCP已经有了全面了解的人。因为本文不会解析TCP头...
  • ModBus/TCP协议分析

    万次阅读 多人点赞 2016-12-22 11:24:31
    ModBus/TCP协议分析 一、术语 1 word = 2 byte; 1 byte = 8 bit. 校验码:校验码是由前面的数据通过某种算法得出的,用以检验该组数据的正确性。代码作为数据在向计算机或其它设备进行输入时,容易产生输入错误,...
  • QQ既有UDP也有TCP! ...这个TCP连接的远程端口一般是80,采用UDP方式登陆的时候,端口是8000。 UDP协议是无连接方式的协议,它的...QQ采用的通信协议以UDP为主,辅以TCP协议。由于QQ的服务器设计容量是海量级的应用...
  • TCP/IP协议

    千次阅读 2011-05-12 09:30:00
    Internet采用的就是TCP/IP协议,网络上各种各样的计算机上只要安装了TCP/IP协议,它们之间就能相互通信。运行TCP/IP协议的网络是一种采用包(分组)交换网络。TCP/IP协议是由100多个协议组成的协议集,TCP和IP是其中...
  • 基于TCP协议的网络摄像头的设计与实现一、摘要 基于TCP协议的网络摄像头的设计大部分和博文“基于UDP协议的网络摄像头的设计与实现”相同,本篇博文采用TCP协议栈为NicheStack协议栈(同理,可使用LWIP协议栈实现...
  • 基于TCP协议的网络程序

    千次阅读 2016-08-07 17:56:07
     TCP协议作为传输层的主要协议,不仅可以支持本地的数据通信,还可以支持跨网络的进程间通信。在互联网中,我们可以通过“IP地址+端口号”标识唯一的一个进程,“IP地址+端口号”被称为socket,这就是网络socket...
  • TCP/IP协议、Http协议、ftp协议

    千次阅读 2015-10-13 23:59:20
    TCP/IP起源于20世纪60年代末美国政府资助的一个网络分组交换研究项目,TCP/IP是发展至今最成功的通信协议,它被用于当今所构筑的最大的开放式网络系统Internet之上。 TCP和IP是两个独立且紧密结合的协议,负责管理...
  • TCP/IP协议理论

    千次阅读 2017-08-28 19:35:28
    TCP-IP详解卷一:协议》 《用TCP-IP进行网际互联第一卷:原理、协议与结构》 《LwIP协议深度剖析与实战演练》 《嵌入式Internet TCP IP基础、实现及应用》 TCP/IP协议族通俗综述 OSI结构仅仅停留在...
  • 使用libnet与libpcap构造TCP/IP协议软件

    千次阅读 2016-10-28 10:11:44
    本文在RED HAT Linux8.0+以太网环境下,利用libnet和libpcap库实现了一个以太网上用户态的单进程的TCP/IP协议软件包:minitcpip,该软件实现了TCP协议的基本通讯功能,并提供了一个调试接口和一个与标准SOCKET接口...
  • TCP/IP协议以及TCP状态机

    万次阅读 2014-03-06 20:17:42
    TCP/IP协议以及TCP状态机   1 TCP/IP 1.1 概述 TCP/IP协议族(TCP/IP ...由于在网络通讯协议普遍采用分层的结构,当多个层次的协议共同工作时,类似计算机科学中的堆栈,因此又被称为TCP/IP协议栈(TCP/IP Pr
  • MATLAB基于ModBus TCP协议与PLC进行通信的实现

    千次阅读 多人点赞 2019-06-18 20:18:40
    ModBus TCP协议是由ModBus系列通信协议派生而来,具有简单、中立产商、运行可靠的优点。它基于TCP/IP协议,可以直接在以太网上传输,在OSI模型中处于第五层(应用层),目前广泛运用于自动化设备的管理和控制中。在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 125,345
精华内容 50,138
关键字:

哪些软件采用tcp协议