zoukankan      html  css  js  c++  java
  • TCP/IP协议

    TCP/IP协议

    TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。

    TCP/IP 不是一个协议,而是一个协议族的统称,里面包括了 IP 协议、ICMP 协议、TCP 协议、以及 http、ftp、pop3、https 协议等。网络中的计算机都采用这套协议族进行互联。

    TCP/IP模型框架

    • 链路层:处理与电缆(或者其他任何传输媒介)的物理接口细节
    • 网络层:处理分组在网络中的活动,例如分组选路
    • 传输层:为两台主机上的应用程序提供端到端的通讯
    • 应用层:处理特定应用程序的细节
    层级 协议 实现平台
    应用层 HTTP、FTP 基于浏览器、其他应用等
    传输层 TCP、UDP 基于windows、Mac、linux
    网络层 IP、ICMP、IGMP 基于windows、Mac、linux
    链路层 设备驱动程序及接口卡、以太网协议 基于windows、Mac、linux

    注释:分层的目的是为了简化实际使用过程中的工作细节(物理层细节) ,减少工作量。

    • 端系统(end system)
    • 中间系统(intermediate system)
    • 应用层和运输层使用端到端(end-to-end)协议
    • 网络层提供的是逐跳(hop-to-hop)协议
    • 网络IP提供的是一种不可靠的服务,它只是负责尽可能快的把分组从源结点送到目的结点,但是不提供可靠性保障。
    • TCP则是在不可靠的IP层上提供一个可靠的运输层

    TCP与UDP的区别

    • TCP使用不可靠的IP服务,并提供一种可靠的传输层服务,即TCP的传输需要传输的双方进行确认,如果数据丢失,则需要重新传输以保证数据的完整性。
    • UDP为应用程序发送和接受的数据报,和TCP不同的是其本身不可靠,即数据的发送会发生丢失,从而导致数据的不完整,但是其发送的时间短。
    • IP是网络层上的主要协议,同时被TCP和UDP使用。
    • ICMP是IP协议的附属协议。

    TCP三次握手和四次挥手

    • 三次握手
      • 第一次握手

        客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。这个三次握手中的开始。表示客户端想要和服务端建立连接。

      • 第二次握手

        TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己随机初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。这个报文带有SYN(建立连接)和ACK(确认)标志,询问客户端是否准备好。

      • 第三次握手

        TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。这里客户端表示我已经准备好。

    注释:为什么要三次握手呢,而不是两次握手就好了。

    举例:已失效的连接请求报文段。

    client发送了第一个连接的请求报文,但是由于网络不好,这个请求没有立即到达服务端,而是在某个网络节点中滞留了,直到某个时间才到达server,本来这已经是一个失效的报文,但是server端接收到这个请求报文后,还是会想client发出确认的报文,表示同意连接。假如不采用三次握手,那么只要server发出确认,新的建立就连接了,但其实这个请求是失效的请求,client是不会理睬server的确认信息,也不会向服务端发送确认的请求,但是server认为新的连接已经建立起来了,并一直等待client发来数据,这样,server的很多资源就没白白浪费掉了,采用三次握手就是为了防止这种情况的发生,server会因为收不到确认的报文,就知道client并没有建立连接。这就是三次握手的作用。

    • 四次挥手
      • 第一次挥手

        TCP发送一个FIN(结束),用来关闭客户到服务端的连接。客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

      • 第二次挥手

        服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

      • 第三次挥手

        服务端发送一个FIN(结束)到客户端,服务端关闭客户端的连接。服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

      • 第四次挥手

        客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

    注释:那么为什么是4次挥手。

    为了确保数据能够完成传输。

  • 相关阅读:
    洛谷 P5249 [LnOI2019]加特林轮盘赌 概率DP
    c++提高学习笔记——05-c++STLday10
    c++基础学习笔记——04-c++day09
    c++基础学习笔记——04-c++day08
    c++基础学习笔记——04-c++day07
    c++基础学习笔记——04-c++day06
    c++基础学习笔记——04-c++day05
    c++基础学习笔记——04-c++day04
    c++基础学习笔记——04-c++day03
    c++基础学习笔记——04-c++day02
  • 原文地址:https://www.cnblogs.com/spmt/p/10491743.html
Copyright © 2011-2022 走看看