协议
协议就是计算机与计算机之间通信的“约定”,既为规则,只有遵循这个约定,双方就可以进行通信。
进程之间的通信
从通信和信息处理的角度来看,运输层向上面的应用层提供通信的服务,属于面向通信的最高层,同时也是用户功能的最底层。端到端的通信就是两个应用进程之间的通信
用户数据报协议UDP
特点
面向无连接通信
尽最大努力交付,是不可靠的传输
面向报文
没有拥塞控制
支持一对一,一对多,多对一,多对多的通信
首部开销小
首部格式
(1)源端口:源端口号。在需要对方回信时选用。不需要时可用全0。
(2)目的端口:目的端口号。在终点交付报文时使用。
(3)长度:UDP用户数据报的长度,其最小值是8(仅有首部)。
(4)检验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。
当运输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口上交最后的终点——应用进程。
如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送方。虽然在UDP之间的通信要用到其端口号,但由于UDP的通信是无连接的,因此不需要使用套接字(TCP之间的通信必须要在两个套接字之间建立连接)。UDP用户数据报首部中检验和的计算方法很特殊。在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部。所谓“伪首部”是因为这种伪首部并不是UDP用户数据报的真正的首部。只是在计算检验和时临时添加在UDP用户数据报前面,得到一个临时的UDP用户数据报。检验和就是按照这个临时的UDP用户数据报来计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。
(检验和的计算方法有些复杂,在此不做计算)
TCP传输控制协议
特点
面向连接的传输协议
每一条TCP连接都是点对点的,端点为套接字(socket)
可靠交付,就是相较于udp来说是安全的
提供全双工通信(全双工通信就是双方既是发送方也是接收方)
面向字节流
TCP连接点对点
每一条tcp连接都有两个端点,这个端点不是udp中的应用进程,而是叫做套接字(socket)根据定义,端口号连接到IP地址后面即构成了套接字,因此,套接字的表示方法是在点分十进制的ip地址后面加一个端口号,并且用冒号隔开
同一个IP地址可以有多个不同的TCP连接,而同一个端口也可以出现在多个不同的TCP连接中
同一个名词socket表达的意思也是不一样的,允许程序访问连网的协议叫做应用编程接口API
tcp报文段首部格式
(1)源端口和目的端口
各占 2 个字节,分别写入源端口号和目的端口号。 TCP 的分用功能是通过端口实现的。
(2)序号
占 4 字节。序号范围是[0, 232−1 ],共 232 (即 4 294 967 296)个序号。序号增加到 232−1 后,下一个序号就又回到 0。也就是说,序号使用 mod 232 运算。 TCP 是面向字节流的。在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号字段值是 301,而携带的数据共有 100字节。这就表明:本报文段的数据的第一个字节的序号是 301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从 401 开始,即下一个报文段的序号字段值应为 401。这个字段的名称也叫做“报文段序号”。
(3)确认号
占 4 字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如, B 正确收到了 A 发送过来的一个报文段,其序号字段值是 501,而数据长度是 200 字节(序号 501 ~ 700),这表明 B 正确收到了 A 发送的到序号 700 为止的数据。因此, B 期望收到 A 的下一个数据序号是 701,于是 B 在发送给 A 的确认报文段中把确认号置为 701。现在的确认号不是 501,也不是 700,而是 701。
总之,应当记住:若确认号 = N,则表明:到序号 N – 1 为止的所有数据都已正确收到。
由于序号字段有 32 位长,可对 4 GB(即 4 千兆字节)的数据进行编号。在一般情况下可保证当序号重复使用时,旧序号的数据早已通过网络到达终点了。
(4)数据偏移
占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。这个字段实际上是指出 TCP 报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。但应注意,“数据偏移”的单位是 32 位字(即以 4 字节长的字为计算单位)。由于 4 位二进制数能够表示的最大十进制数字是 15,因此数据偏移的最大值是 60 字节,这也是 TCP 首部的最大长度(即选项长度不能超过 40 字节)。
(5)保留
占 6 位,保留为今后使用,但目前应置为 0。
下面有 6 个控制位,用来说明本报文段的性质,它们的意义见下面的(6)~(11)。
(6)紧急 URG (URGent)
当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行。因此用户从键盘发出中断命令( Control + C)。如果不使用紧急数据,那么这两个字符将存储在接收 TCP 的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了许多时间。
当 URG 置 1 时,发送应用进程就告诉发送方的 TCP 有紧急数据要传送。于是发送方TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。
(7)确认 ACK (ACKnowledgment)
仅当 ACK = 1 时确认号字段才有效。当 ACK = 0时,确认号无效。 TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
(8)推送 PSH (PuSH)
当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下, TCP 就可以使用推送(push)操作。这时,发送方 TCP 把 PSH 置 1,并立即创建一个报文段发送出去。接收方TCP 收到 PSH = 1 的报文段,就尽快地(即“推送”向前)交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
虽然应用程序可以选择推送操作,但推送操作很少使用。
(9)复位 RST (ReSeT)
当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。 RST 置 1 还用来拒绝一个非法的报文段或拒绝打开一个连接。 RST 也可称为重建位或重置位。
(10)同步 SYN (SYNchronization)
在连接建立时用来同步序号。当 SYN = 1 而 ACK= 0 时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN = 1 和 ACK = 1。因此, SYN 置为 1 就表示这是一个连接请求或连接接受报文。
(11)终止 FIN
(FINis,意思是“完”、“终” ) 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
(12)窗口
占 2 字节。窗口值是[0, 216 – 1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之, 窗口值作为接收方让发送方设置其发送窗口的依据。
例如,发送了一个报文段,其确认号是 701,窗口字段是 1000。这就是告诉对方:“从701 号算起,我(即发送此报文段的一方)的接收缓存空间还可接收 1000 个字节数据(字节序号是 701 ~ 1700),你在给我发送数据时,必须考虑到这一点。”
总之,应当记住:窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化着。
(13)检验和
占 2 字节。检验和字段检验的范围包括首部和数据这两部分。和 UDP用户数据报一样,在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。伪首部的格式与图中 UDP 用户数据报的伪首部一样。但应把伪首部第 4 个字段中的 17 改为 6(TCP 的协议号是 6),把第 5 字段中的 UDP 长度改为 TCP 长度。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用 IPv6,则相应的伪首部也要改变。
(14)紧急指针
占 2 字节。紧急指针仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。 当所有紧急数据都处理完时, TCP 就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为零时也可发送紧急数据。
TCP 最初只规定了一种选项,即最大报文段长度 MSS (Maximum Segment Size) 。注意 MSS 这个名词的含义。 MSS 是每一个 TCP 报文段中的数据字段的最大长度。数据字段加上 TCP 首部才等于整个的 TCP 报文段。所以 MSS 并不是整个 TCP 报文段的最大长度,而是“TCP 报文段长度减去 TCP 首部长度”。
为什么要规定一个最大报文段长度 MSS 呢?这并不是考虑接收方的接收缓存可能放不下 TCP 报文段中的数据。实际上, MSS 与接收窗口值没有关系。我们知道, TCP 报文段的数据部分,至少要加上 40 字节的首部(TCP 首部 20 字节和 IP 首部 20 字节,这里都还没有考虑首部中的选项部分),才能组装成一个 IP 数据报。若选择较小的 MSS 长度,网络的利用率就降低。设想在极端的情况下,当 TCP 报文段只含有 1 字节的数据时,在 IP 层传输的数据报的开销至少有 40 字节(包括 TCP 报文段的首部和 IP 数据报的首部)。这样,对网络的利用率就不会超过 1/41。到了数据链路层还要加上一些开销。但反过来,若 TCP 报文段非常长,那么在 IP 层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的 TCP 报文段。当传输出错时还要进行重传。这些也都会使开销增大。
因此, MSS 应尽可能大些,只要在 IP 层传输时不需要再分片就行。由于 IP 数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要分片的 MSS,如果改走另一条路径就可能需要进行分片。因此最佳的 MSS 是很难确定的。在连接建立的过程中,双方都把自己能够支持的 MSS 写入这一字段,以后就按照这个数值传送数据,两个传送方向可以有不同的 MSS 值 。若主机未填写这一项,则 MSS 的默认值是 536 字节长。因此,所有在互联网上的主机都应能接受的报文段长度是 536 + 20(固定首部长度) = 556 字节。
随着互联网的发展,又陆续增加了几个选项。如窗口扩大选项、 时间戳选项等。以后又增加了有关选择确认(SACK)选项。
窗口扩大选项是为了扩大窗口。我们知道, TCP 首部中窗口字段长度是 16 位,因此最大的窗口大小为 64 K 字节。虽然这对早期的网络是足够用的,但对于包含卫星信道的网络 ,传播时延和带宽都很大,要获得高吞吐率需要更大的窗口大小。
窗口扩大选项占 3 字节,其中有一个字节表示移位值 S。新的窗口值等于 TCP 首部中的窗口位数从 16 增大到(16 + S)。移位值允许使用的最大值是 14,相当于窗口最大值增大到 216+14−1 。
窗口扩大选项可以在双方初始建立 TCP 连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送 S = 0 的选项,使窗口大小回到 16。
时间戳选项占 10 字节, 其中最主要的字段是时间戳值字段(4 字节) 和时间戳回送回答字段(4 字节)。时间戳选项有以下两个功能:
第一,用来计算往返时间 RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出 RTT 来。
第二,用于处理 TCP 序号超过 232 的情况,这又称为防止序号绕回 PAWS (ProtectAgainst Wrapped Sequence numbers)。我们知道, TCP 报文段的序号只有 32 位,而每增加 232 个序号就会重复使用原来用过的序号。当使用高速网络时,在一次 TCP 连接的数据传送中序号很可能会被重复使用。例如,当使用 1.5 Mbit/s 的速率发送报文段时,序号重复要 6小时以上。但若用 2.5 Gbit/s 的速率发送报文段,则不到 14 秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段区分开,可以在报文段中加上这种时间戳。
拥塞控制
网络中某一资源的需求量超过了资源所能提供的可用部分,网络性能就要变坏叫做拥塞
TCP进行拥塞控制的四种算法
慢开始
拥塞避免
快重传
快恢复
三次握手
四次挥手
为什么建立连接需要三步,而释放连接需要四步?文章来源:https://www.toymoban.com/news/detail-423376.html
因为发送请求时同时发送SYN和ACK报文,而释放连接四次挥手存在三次挥手的可能,但是重点取决于b端是不是有数据发,如果没有数据那就会将ACK和FIN一次发过去;如果有数据还没发完就分两步进行,先发ack确认收到消息,等数据发完以后在发送FIN报文文章来源地址https://www.toymoban.com/news/detail-423376.html
到了这里,关于计算机网络之运输层的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!