TCP 协议学习(一)

545 阅读4分钟

传输层概述

TCP协议的特点是:面向连接 字节流可靠传输
那么TCP连接是什么意思?我们知道TCP协议通信的双方必须建立连接,然后才能建立数据的读写,那么说在其通信双方都需要为此次连接分配相应的内核资源,以管理连接的状态和连接数据的传输

TCP连接是全双工的,双方的数据读写可以通过一个连接进行,完成TCP连接后双方都需要断开连接,以释放系统资源,TCP连接是一对一,那么说广播和多播则不可以使用TCP,那么UDP则可以

发送端执行的写操作和接收端执行的读操作,这两者之间没有任何的数量关系,TCP的发送没有任何的边界限制,这也就是TCP连接的流的概念

下面展示下TCP字节流服务和UDP的数据包服务的区别

上面展示的是TCP字节流服务的特别,我们可以看出,我们的发送端,每次首先需要把数据放入内核缓冲区中,然后在放入TCP发送缓冲区中,在传输中,我们将TCP缓冲区的数据封装成TCP报文,接受端口,接收到我们的TCP报文后,将其存入到TCP接收缓冲区中,然后我们的接收端仅仅需要执行一次Recv()函数即可

通过图我们可以看出,我们的发送端将数据送到传输层的时候需要封装成UDP报文段,那么我们的接受端接收到这个报文段的时候需要执行recvform()函数,那么说,我们的发送端发送的次数,必然与我们接收端接收的层数是一一对应的,否则将产生丢包的结果

那么在这里有一个问题就是为什么说TCP连接是可靠的?
因为TCP采用了发送应答机制,那么说我们的发送端必须得到接收端的应答才可以完成数据的传输,其次就是超时重传机制,首先我们的发送端将数据进行发送,如果我们在规定的时候内,我们并没有收到接收端的应答,那么说我们的发送端将会重新发送数据

那么传输层在整个TCP/IP协议簇的作用是什么?
那么我们首先来看一张TCP头部结构图:

分析:

我们知道TCP头部信息出现在每个TCP报文段中,它用于指定通信的源端端口和目标端口,管理TCP连接等这些任务

  • 16位源端端口和16位目标端口: 为了告知主机报文段是来自哪里,这里的哪里就是指的源端端口,以及传给哪一个上层协议或者应用程序,上次协议和应用程序就是指的目标端端口,客户端一般选择客户端应用程序选择的临时端口号,而服务器则是选择已知的服务端端口号,在linux下端口号一般定义在etc/service下

  • 32位序号:在一次完整的传输过程中,指的是TCP从建立连接到断开过程中,在传输方向上每个字节的编号就是由这个32位序号来确认的

  • 32位确认号:用于另一方发过来报文段的响应,它的值为收到的报文段的值+1

  • 4位头部长度字段:标志着该TCP头部长度由多少个4字节

  • 6位保留字段和6位标志字段:URG: 紧急指针是否有效ACK:确认号是否有效PSH:提示TCP接收端立即接收数据,为后续数据提升空间RST: 表示要求对方重新建立连接 SYN: 表示请求建立一个连接FIN:通知对方本方要关闭连接

  • 16位窗口大小:为TCP流量控制的手段,主要用于接收通告窗口,告诉对方本端接收缓冲区中还能容纳多少的数据,这样对方就能够控制发送数据的速度

  • 16位校验和:由发送端填充,接收端对发送端执行CIC算法,来检验传输中的报文段是否损坏,这里不止校验TCP头部还包括数据部分

  • 16位紧急指针:最后一次紧急数据的一次字节的序号

  • TCP头部选项字段:最多40字节,典型的选项字段如下图所示:

Kind:表明选项的类型
length:指定该选项的总长度
info:选项的具体信息

本文由 monsterlin 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: May 10, 2017 at 04:26 pm