TCP --传输控制协议

一、TCP为应用层提供的服务

TCP协议 :transfer control protocol 一种面向连接的、可靠的、基于字节流的传输层的协议

特点:

  • 面向连接
  • 点到点的通信
  • 高可靠性
  • 占用系统资源多、效率低

  面向连接意味着两个使用TCP的应用(通常是Server和Client),在彼此交换数据之前必须先建立一个TCP连接;

  TCP通过下列方式来提供可靠性:

  • 应用数据被分割成TCP认为最适合发送的数据块(UDP应用程序产生的数据报长度是保持不变的),由TCP传递给IP的信息单位称为报文段或段(segment);
  • 当TCP发出一个段后,会启动一个定时器,等待目的端确认接收到了这个报文段,如果未能及时收到这个确认,会重新发送这个报文段;
  • 当TCP收到来自连接另一端的数据,它都会在推迟几分之一秒之后发送一个确认;
  • TCP将保持它首部和报文段的检验和,这时一个端到端的检验和,目的是检测数据在传输过程中的任何变化,如果收到的报文段的检验和有差错,TCP会丢弃这个报文段,并且不会回复确认(希望发送端超时并重发);
  • TCP报文段作为IP数据报来传输,而IP数据报的到达可能会乱序,所以TCP报文段的到达也可能是乱序的,在必要时,TCP会对收到的数据进行重新排序之后,按照正确的顺序交给应用层;
  • IP数据报会发生重复,那么TCP的接收端必须丢弃掉重复的数据
  • TCP可以提供流量控制,TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区所能容纳的数据大小,这样防止较快主机使较慢主机的缓冲区溢出。

  两个应用程序通过TCP连接交换8bit字节构成的字节流,TCP不再字节流中插入记录标识符,将这称为字节流服务(byte stream service),如果一方的应用程序先传10字节,又传20字节,再传50字节,接收方无法了解发送端每次发送了多少个字节,接收方可以份4次接收这80个字节,每次接收20字节,一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。

  TCP对字节流的内容不作任何解释,TCP不知道传输的数据字节流是什么类型的数据,对字节流的解释由TCP连接双方的应用层解释。这种对字节流的处理方式与Unix操作系统对文件的处理方式很相似,Unix内核对一个应用读写的内容不做任何解释,而是交给应用程序处理,对Unix内核来说,它无法区分其是二进制文件还是一个文本文件。

二、TCP首部及各字段的释义

在这里插入图片描述
TCP数据被封装在一个IP数据报中;
如果不计选项和填充字段,TCP首部通常是20字节的固定长度,但其最多有60字节的长度;

TCP头部信息字段释义:

  • 源端口号以及目的端口号
      各占2个字节,端口是传输层和应用层的服务接口,用于寻找发送端和接收端的进程, 一般来讲,通过这两个端口号和IP首部中的源IP地址、目的IP地址,可以唯一确定一个TCP连接,在网络编程中,一个IP地址和一个端口号通常被称为一个socket接口,一个接口对(包含客户端的端口号和IP地址、服务器端的端口号和IP地址)可以唯一确定互联网络中每个TCP连接的双方;
  • 序号
      占4字节,用来标识从TCP发送端向TCP接收端发送的数据字节流,表示在这个报文段中的第一个数据字节;
  • 确认序号
      占4字节,每个传输的字节都会被计数,那么确认序号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应该是上次已经成功收到数据字节序号加1,但只有在ACK标识为1时确认字段才有效;
  • 数据偏移
      占4位,用于指出TCP首部长度,若不存在选项,则这个值默认为20字节,且数据偏移的最大值为60字节;
  • 保留字段
      占6位,暂时可忽略,值全为0;
  • 标志位(各占1位)
    • URG(紧急) : 为1时表明紧急指针字段有效;
    • ACK(确认):为1时表明确认号字段有效;
    • PSH(推送):为1时接收方应尽快将这个报文段交给应用层;
    • RST(复位):为1时表明TCP连接出现故障必须重建连接;
    • SYN(同步):在连接建立时用来同步序号,用于建立连接;
    • FIN (终止): 为1时表明发送端数据发送完毕要求释放连接;
  • 接收窗口
      占2个字节,用于流量控制和拥塞控制,表示当前接收缓冲区的大小16bit字段,所以窗口大小最大为65535字节,不过新的窗口刻度选项允许该值按比例变化来提供更大的窗口;
      在计算机网络中,通常是用接收方的接收能力的大小来控制发送方的数据发送量,TCP连接的一端根据缓冲区大小确定自己的接收窗口值,告诉发送方,使对方可以确定发送数据的字节数;
  • 校验和
      占2个字节,覆盖了整个TCP报文段,包括首部和数据两部分,是一个强制性的字段,一定是由发送端计算和存储,由接收端进行验证,TCP检验和的计算与UDP检验和的计算相似,使用一个伪首部;
  • 紧急指针
      紧急指针是一个偏移量,和序号字段中的值相加标识紧急数据最后一个字节的序号,TCP的紧急方式是发送端向接收端发送紧急数据的一种方式;

  TCP报文段中的数据部分是可选的,因为在建立一个连接或终止连接时,双方交换的报文段仅有TCP首部,如果一方没有数据要发送,也使用没有任何数据的首部来确认接收到的数据,在处理超时时大都也会发送不带任何数据的报文段;

总结:

  TCP将用户书打包构成报文段,它发送数据后启动一个定时器,另一端对接收到的数据进行确认,对失序的数据进行重新排序,丢弃重复数据,TCP提供端到端的流量控制,并计算和验证一个强制性的端到端的检验和。

  TCP是一个面向连接的协议,无论是哪一方向另一方发送数据之前都必须现在双方之间建立一条连接;

三、网络基于C/S模型 客户端(Client)和服务端(Server)在TCP中交互步骤

在这里插入图片描述

四、TCP协议编程练习

注意:客户端连接服务端时,必须先启动服务端;

  • Server
public static void main(String[] args) throws IOException {
        //创建serversocket的实例
        ServerSocket serverSocket = new ServerSocket();

        //绑定端口
        serverSocket.bind(new InetSocketAddress(8888));
//        System.out.println("服务端启动了");
        //监听并获得socket,该方法会阻塞
        Socket socket = serverSocket.accept();
//        System.out.println(socket.getRemoteSocketAddress()+" 客户端连接上了");
        
        //可以进行读写操作
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String msg = null;
        while ((msg = reader.readLine())!= null) {
            System.out.println(msg);
        }

        //关闭资源
        reader.close();
        socket.close();
        serverSocket.close();
    }
  • Client
public static void main(String[] args) throws IOException {
        //创建socket实例
        Socket socket = new Socket();

        //连接服务器  192.168.31.135
        socket.connect(new InetSocketAddress("127.0.0.1", 8888));
//        System.out.println("客户端连接上服务器了");

        //发送消息
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello\n".getBytes());

        //关闭资源
        socket.close();
    }    

五、基于TCP和UDP协议进行Socket编程的区别
基于TCP协议的Socket编程 基于UDP协议的Socket编程
通信双方需要建立连接 通信双方不需要建立连接
连接建立时双方存在主次之分 通信双方完全平等

流式服务:数据是一条数据源,数据是没有界限的,发送次数和接收的次数没有直接关系,
     接收方将数据放在缓冲区,数据一次不能接收完,可以放在缓冲区,进行二次读取;
数据报服务:发送次数和接收次数相等,
      如果接收端一次未能读取完传输层的数据,剩余的数据直接被丢弃掉。

猜你喜欢

转载自blog.csdn.net/Daria_/article/details/90704793