TCP/IP协议模型详解二TCP

TCP/IP协议模型详解二TCP

2.2.2、TCP传输控制协议

前面已讲到通过端口号识别应用程序来连接,TCP被称为三次握手传输协议,是一个面向连接的协议。什么是面向连接就是先与对端联系,确定好细节之后,再传输。就好比做要与一个人电话谈事,先打电话,对方接电话后,确定人在,再问现在有空不?对方说有空,才能继续后面的讲话。由于TCP的以上特性,适用于要求可靠传输的应用,例如文件传输。

可靠性是指:传输数据时实施的顺序控制和重发控制、流量控制、拥塞控制功能。

1、TCP传输控制协议的原理
从应用层传来数据,在传输层分成数据段(segment),然后给每个数据段按顺序编号。面向连接是向下发送数据段之前先与目标主机联系,并将数据长度发送过去,收到目标主机确认后,创建连接,以确保可靠传输。在传输过程中,发送数据段后还要等待目标主机确认,并重传没有收到确认的数据段。在过程中可以看到发送方与接收方不断联系,接收方检查错误,回复接收信息。在有限的带宽通信线路中,这种频繁的交互信息占用大量带宽,使得线路传输效率低下,网络开销很大。

特点:建立连接通道,数据大小无限制速度慢,可靠性高。

2、TCP报头
TCP发送的数据包含有什么?每个字段有什么作用?
在这里插入图片描述
在这里插入图片描述

TCP报文格式:
在这里插入图片描述

源端口和目的端口
TCP源端口(Source Port):16位2字节,标识客户主机正在运行的应用程序。
TCP目的端口(Destination Port):16位2字节,连接的目标主机的应用程序。

序列号Sequence Number
占 32 位4字节。序号范围是0-232-1,总共有232个序号,最高序号是232-1=4284967296-1=4284967295,当到这一序号后,下一个序号重回到0。在一个TCP连接中每一个字节都按顺序编号。序列号字段指的是本报文段的所发送的数据第一个字节的序号加1。

下面的案例是以一种以理解方便设置了1的序列号。实际运行中,建立连接时,初始序列号确实是“随机”生成的,一般是基于时间,利用散列函数(这个函数一定时间也会轮换)计算而成的,传给主机,然后携带数据后,将序列号=初始序列号+转发数据字节数+1。

在Wireshark这种工具,通常显示的都是相对序列号/确认号,而不是实际序列号/确认号,所以看不出一来。

比如说这个数据总共是1000字节,到达传输层进行分段,这是第二段,此时这个要封装数据段第一个字节的编号是100,这一数据段的数据是100字节。
传输层数据分段

在这里插入图片描述

TCP的数据长度在TCP报文中并没有,实际通信中是通过计算公式得到,IP首部中的数据包长度-IP首部长度TCP首部长度得到。

首先由客户端发出请求连接即 SYN=1 ACK=0 ,TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=1。

然后 Server 进行回复确认,即 SYN=1 ACK=1 seq=x+1=101, ack=x+1
再然后客户端再进行一次确认,但不用SYN了,这时即为 ACK=1, seq=x+1。

确认号
占 32位4字节。表示下一次应收的数据的序列号,实际上是已收的序列号-1,确认号=初始序列号+转发数据字节数+1-1。

报头长度
占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远。
由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任选子段时长度为20字节;4位首部长度字段所能表示的最大值为1111,转化为10进制为15,故报头最大长度为15*32/8=60个字节。首部长度也叫数据偏移。

保留
为将来定义新的用途保留,一般置为0。

控制位

  • URG:紧急指针标志。1:表示包中有需要紧急处理的数据。;0:忽略紧急指针。
  • ACK:确认序号标志。1:确认应答的字段有效;0:忽略该号段。
  • PSH:1:带有push标志的数据,表示接收方在接收到该报文后应尽快将这个报文段交给应用程序;0表示不用急着传,先放入缓存中。
  • RST:RST=1时表示TCP中出现异常的必须强制断开连接。由于主机崩溃或其他原因而出现错误的连接,或者用于拒绝非法的报文段和拒绝连接请求。
  • SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1表示希望建立连接,同时进行序列号初始值的设定。
  • FIN:结束标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

窗口
用于通知从相同TCP首部的确认应答号所指的目标端口号能接收的数据大小。TCP不允许源端口号客户端发送超过此处所示大小的数据,从而达到流量控制。窗口大小是2个字节,因而窗口大小最大为65536。窗口为0,表示可以发送窗口探测,以了解最新的窗口大小。条件是数据必须为1字节。

校验和
奇偶校验,此校验和是针对整个TCP报文段的,包括TCP报头和TCP报文数据段,以2个字节进行计算所得。由发送端计算和存储,并由接收端进行验证。

紧急指针
只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。

选项和填充
最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),MSS是在三次握手的时候,在两端主机之间被计算出来。两端的主机在发出建立连接的请求时,会在TCP首部写入MSS选项,告诉对方自己的接口能够适应的MSS大小。它表示本端所能接受的最大报文段的长度。最大报文段长度是指在IP中不会被分组处理的最大长度。

选项长度是指不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的0,以保证TCP头部是32的整数倍。

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

3、TCP建立连接的三次握手

下面的案例是以一种以理解方便设置了1的序列号。实际运行中,建立连接时,初始序列号确实是“随机”生成的,一般是基于时间,利用散列函数(这个函数一定时间也会轮换)计算而成的,传给主机,然后携带数据后,将序列号=初始序列号+转发数据字节数+1。

第 1 次握手建立连接时,客户端向服务器发送 SYN 报文(seq=1,SYN=1),并进入发送状态,等待服务器确认。
在这里插入图片描述
第 2 次握手实际上是分两部分来完成的,即 SYN+ACK(请求和确认)报文。
服务器收到了客户端的请求,向客户端回复一个确认信息。
服务器再向客户端发送一个 SYN 包(seq=100+1)建立连接的请求。
服务器进入确认状态。

第 3 次握手,是客户端收到服务器的回复(SYN+ACK 报文)。此时,客户端也要向服务器发送确认包(ACK)。此包发送完毕客户端和服务器进入已获确认状态,完成 3 次握手。

4、TCP建立连接后传输数据
TCP建立后就开始传输数据,从传输层经过网络层再到网络接口层传到服务端。
在这里插入图片描述
5、断开连接的四次挥手
在这里插入图片描述
6、TCP重发控制

数据包丢失的情况
在这里插入图片描述

没有收到确认应答情况,这种情况一是数据包真的丢失,另一种收到的数据包但确认的报文丢失。
在这里插入图片描述
7、TCP的流量控制
发送方要考虑接收方处理能力,大量接收数据后不会因为处理不了,而导致触发重发机制。TCP的流量控制就是发送端根据接收端实际能力控制发送的数据量的机制。原理为接收端向发送端告知自己能接收数据的大小,不能大于这些个限度。窗口的大小就是接收端决定的。

窗口的原理是:主机的操作系统开辟的一个缓存空间,发送端在发送数据过程中,没有收到接收端确认应答之前,必须将已发送的数据保留在缓冲区,
在特定时间内收到接收端确认应答,清除保留在缓冲区的数据。

窗口引进改变了原来以段为发送单位,原来的每次以一个段为单位发送一次进行确认一次,再发送下一段,效率低下。窗口以最大单位发送段,对多个段同时进行确认应答的功能,将发送数据先保留在缓冲区,收到确认应答,清除缓冲区的数据,这样不必等待一个段收到确认再发送下一段,在发送的段中,收到确认应答的就发送数据。没有收到的等待确认应答。

累计应答模式
一次作4个TCP数据段的TCP链接,这个窗口的大小为4,如果几个TCP数据段都在发送,其中301数据段确认应答丢失,只要收到401数据段确认应答,那说明实际301数据段已是发送,只是确认应答未及时到达,否则不会收到下一段的,发送方先保留数据在缓冲区,继续等待确认应答。

在这里插入图片描述
窗口值越大说明,这个网络传输数据量大,一旦接收端的缓冲区数据将发生溢出,接收端将会缩少窗口,减少传输数据量,并通知发送端,我这里快装满了,按我给你的数量发。发送端收到通知,将按照接收端的要求办理。为防止发送端窗口调整通知丢失,发送端发送的数据段会间隔一段时间发一次,仅含一个字节。

8、拥塞控制
在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。拥塞控制涉及两种算法,一种叫做慢启动算法、一种叫Nagle算法,这里就不多介绍了,有兴趣可以参与TCP/IP几本经典书籍。

9、TCP分段
MSS是在三次握手的时候,在两端主机之间被计算出来。在TCP报文的选项里,MSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。MSS的值一般为MTU值减去两个首部大小。MSS的默认值就为536个字节

MSS= MTU - IP Header - TCP Header

网络接口最大传输单元MTU为1500字节。

MSS= 1500 - 20 -20 = 1460。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0与1之旅

创作不易请给予一点帮助和鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值