Heading for the future

TCP基础概念

定义

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议

特点

TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式

  • 基于流的方式
  • 面向连接
  • 可靠通信方式
  • 在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销
  • 通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点

 

协议规定

  • 数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组;
  • 到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认;
  • 滑动窗口:TCP使用的流量控制协议是可变大小的滑动窗口协议。TCP连接每一方的接收缓冲空间大小都固定,接收端只允许另一端发送接收端缓冲区所能接纳的数据,TCP在滑动窗口的基础上提供流量控制,防止较快主机致使较慢主机的缓冲区溢出;
  • 超时重发:发送方在发送分片时启动超时定时器,如果在定时器超时之后没有收到相应的确认,重发分片;
  • 失序处理:作为IP数据报来传输的TCP分片到达时可能会失序,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层;
  • 重复处理:作为IP数据报来传输的TCP分片会发生重复,TCP的接收端必须丢弃重复的数据;
  • 数据校验:TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到分片的检验和有差错,TCP将丢弃这个分片,并不确认收到此报文段导致对端超时并重发。

 

报文首部

image.png

TCP的固定包头为20个字节,每一行32bit(4Byte),5行。

第一行:源端口与目的端口 

根据OSI七层模型我们知道TCP属于传输层,IP属于网络层,最终数据都在物理层上传输,其中从传输层到网络层会在发送数据前会封装IP首部,表示要传给那台IP地址的机器。然后我们需要知道端口的概念:端口可以认为是 设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口。我们这里指的源端口与目的端口是指虚拟端口的网络端口。根据计算机网络的知识我们知道端口对多有65535个。也就是16个二进制位。因此源端口与目的端口各16bit,占了一行。 

第二行:序号

TCP中每传输的一个数据都有一个序号。因为如果数据太大,我们会将数据切割成不同的数据报,有序号后就不会因为数据包在网络停留时间不一而导致的接受顺序不一样使得数据出现乱序。序号占用32bit,当序号超出2^32-1的话从0重新开始记。 

第三行: 确认号

表示期望下一次发送数据。如果确认号为N,那么表示发送该报文的机器已经接受到了N-1及其以前的数据。 

第四行: 数据偏移,保留,URG,ACK,PSH,RST,SYN,窗口

数据偏移:是指TCP数据起始位置距离TCP报文起始位置的距离,一般情况下为报文首部长度20字节,但TCP首部有一个可选长度要注意。

保留:很明显就是现在没用,留给以后使用

URG:当URG=1,表示该报文是紧急报文,因此发送方会将该报文放在最开头传输,要配合TCP首部紧急指针一起用

ACK:   ACK=1时确认号字段才有效,TCP规定,连接建立后所有传送的报文段都必须把ACK置为1

PSH:  当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送操作

RST: 当RST=1时,表明TCP连接中出现严重错误,必须释放连接,然后再重新建立运输连接

SYN: 在连接建立时用来同步序号,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意时,则应在响应的报文段中使SYN=1和ACK=1,因此,SYN置1就表示这是一个连接请求或连接接受报文。FIN,用来释放一个连接,当FIN=1时,表示此报文段的发送方的数据已发送完毕,并要求释放运输连接

窗口: 占2个字节,窗口指的是发送本报文段的一方的接收窗口,不是自己的发送窗口,告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。窗口值作为接受方让发送方设置其发送窗口的依据,一般用来平衡双方的数据传输速率(带宽)不一致问题。 

第五行: 校验和紧急指针

校验和: 占2字节。校验和字段检验的范围包括首部和数据这两部分。

紧急指针: 占2个字节,紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。当所有紧急数据处理完毕时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可发送紧急数据。

第六行(可选)

优点

  • TCP 协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。
  • 对可靠性要求高的通信系统往往使用 TCP 传输数据。
  • 但是由于各种数据校验机制,导致工作效率较UDP来说较低 
posted @ 2020-04-22 10:32  一只菜鸟攻城狮啊  阅读(623)  评论(0编辑  收藏  举报