《TCP/IP协议族》:TCP协议一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yexiangCSDN/article/details/85764019

1. TCP概述

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

2. TCP 有如下的特点:

面向连接 、可靠性

尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务 TCP 是全双工通信。

许多流行的应用程序如:Telnet, Rlogin, FTP,SMTP 都使用TCP

1. 面向连接

两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。过程与打电话相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。

说明:在一个TCP连接中,仅有两方彼此进行通信。广播和多播不能用于TCP。

2. 可靠性

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

1)应用数据被分割成T C P认为最适合发送的数据块。由TCP传递给IP的信息单位称为报文段或段。

注意:对于UDP,应用程序产生的数据报长度将保持不变。

2)当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,它将重发这个报文段。

3)当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。

4)TCP将保持它的首部和数据检验和。这是一个端到端的检验和,如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。

5)因为TCP报文段是作为IP数据报来传输的,而IP数据报的到达可能会失序,所以TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。

6)因为IP数据报会发生重复,所以TCP的接收端必须丢弃重复的数据

7)TCP提供流量控制。TCP连接的每一方都有固定大小的缓冲区。TCP的接收端只允许另一端发送其缓冲区所能接纳的数据。可防止较快主机致使较慢主机的缓冲区溢出。

注意:TCP对字节流的内容不作任何解释,它不知道传输的数据字节流是二进制数据、ASCII字符、EBCDIC字符或其他类型数据。由TCP双方的应用层对字节流进行解释。

3. TCP面向流的概念

面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流。

4. TCP报文格式

TCP数据被封装在一个IP数据报中,如图17-1所示。

TCP报文格式如图所示:

TCP首部字段说明:

源端口和目的端口:各占两个字节,端口是运输层与应用层的服务接口,运输层的复用和分解功能都要通过端口才能实现。标识发送报文的计算机端口或进程。一个 TCP 报文段必须包括源端口号,使目的主机知道应该向何处发送确认报文。

序号:占4字节,序号范围是[0,2^32-1]。到达2^32-1后又从0开始。因为在TCP是面向字节流的,他会将报文都分成一个个字节,给每个字节进行序号编 , 比如一个报文有900个字节组成,那么就会编成1-900个序号,然后分几部分来进行传输,比如第一次传,序列号就是1,传了50个字节, 那么第二次传,序列号就为51,所以序列号就是传输的数据的第一个字节相对所有的字节的位置。报文段的序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。

在 SYN 标志未置位时,该字段指示了用户数据区中第一个字节的序号;在 SYN 标志置位时,该字段指示的是初始发送的序列号。

用于标识每个报文段,使目的主机可确认已收到指定报文段中的数据。当源主机用于多个报文段发送一个报文时,即使这些报文到达目的主机的顺序不一样,序列号也可以使目的主机按顺序排列它们

在建立连接时发送的第一个报文段中,双方都提供一个初始序列号。TCP 标准推荐使用以 4ms 间隔递增 1 的计数器值作为这个初始序列号的值。使用计数器可以防止连接关闭再重新连接时出现相同的序列号。

确认号:当建立一个新的连接时,SYN标志置1如果 ACK 控制位被设置为 1,则该字段有效。是期望收到对方的下一个报文段的数据第一个字节的序号。 如上面序号举例来说:第一次传了50个字节给对方,对方也会回应你,其中带有确认应答,对方返回带有含确认号50的报头,就是告诉你下一次要传第51个字节来了,所以这个确认应答就是告诉对方要传第多少个字节了。 若确认号 == N,则表明到序号N-1为止的所有数据都已正确收到。

注意:

只有ACK标志为1时确认序号字段才有效。

1. 目的主机不一定每次接受都返回确认号,比如每个报文100个字节,发送了3个,假设序列号从1000开始,那么有可能等这3个报文都收到了后再返回一个1300的报头,表示已经把300个字节都收到了。

2.当收到了第一个100字节,应该返回1100确认号,这时候第二个100字节还没收到确认但是第三个100字节已经收到了,这个时候不会立刻返回1300的确认号,要等待第二个100字节确认收到了才发。

3. 并且如果发送主机等待时间过长会重新发送。

首部长度:(首部长度给出首部中32 bit字的数目这个值是因为任选字段的长度是可变的,这个字段占4 bit,因此TCP最多有60字节的首部(32bit*(2^4-1))。如果没有选项字段,则报头长度值为 5 ,表示报头一个有 160 比特。正常的长度是20字节

保留:6bit, 均为0. 给以后有需要在用

控制位:目前有的控制位为6个

URG:紧急,当URG =1时,表名紧急指针字段有效,标识该报文是一个紧急报文,传送到目标主机后,不用排队,应该让该报文尽量往下排,让其早点让应用程序给接受。

ACK:确认,当ACK =1时,确认序号才有效。当ACK为0时,确认序号没用

PSH:推送,当PSH = 1时,当遇到此报文时,会减少数据向上交付,本来想应用进程交付数据是要等到一定的缓存大小才发送的,但是遇到它,就不用在等足够多的数据才向上交付,而是让应用进程早点拿到此报文,这个要和紧急分清楚,紧急是插队,但是提交缓存大小的数据不变,这个推送就要排队,但是遇到他的时候,会减少交付的缓存数据,提前交付。

RST:复位,报文遇到很严重的差错时,比如TCP连接出错等,会将RST置为1,然后释放连接,全部重新来过。

SYN:同步,在进行连接的时候,也就是三次握手时用得到,下面会具体讲到,配合ACK一起使用。仅在三次握手建立 TCP 连接时有效。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段对方若同意建立连接,则应在相应的报文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置 1 就表示这是一个连接请求或连接接受报文。

FIN:终止,在释放连接时,也就是四次挥手时用的。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

窗口:用来控制对方发送的数据量(允许对方发送的数据量)。单位为字节。告诉对方在不等待确认的情况下,可以发来多大的数据。这里表示的最大长度是2^16 - 1 = 65535,如需要使用更大的窗口大小,需要使用选项中的窗口扩大因子选项。

校验和:检验TCP首部和TCP数据这两部分,和UDP一样,需要拿到伪首部中的数据来帮助检测。这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证。

伪首部可以参考 《TCP/IP协议族》:UDP协议

伪报头并不在网络中传输,并且在校验和中包含伪报头的目的是为了防止目的主机错误地接收存在路由的错误数据报。

紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。(紧急数据结束后就是普通数据)即指出了紧急数据的末尾在报文中的位置。 紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。如:如果报文段的序号是 1000,前 8 个字节都是紧急数据,那么紧急指针就是 8 。那么紧急数据最后一个字节的序号就是1008.

注意:即使窗口为零时也可发送紧急数据。

选项、填充:可能包括“窗口扩大因子”、“时间戳”等选项。长度可变,最长可达 40 字节,当没有使用选项时,TCP 首部长度是 20 字节。最常见的可选字段是最长报文大小MMS (Maximum Segment Size)​​​​​​​,每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。

填充用于保证任选项为 32bit 的整数倍。

猜你喜欢

转载自blog.csdn.net/yexiangCSDN/article/details/85764019