目录
1、传输控制协议 TCP 概述
(1)TCP 的特点
(1)TCP 是面向连接的运输层协议。这就是说,应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接。
(2)每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。
(3)TCP 提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。
(4)TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给 TCP 的缓存后,就可以做自己的事,而 TCP 在合适的时候把数据发送出去。在接收时,TCP 把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
(5)面向字节流。TCP 中的“流”(stream)指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP 并不知道所传送的字节流的含义。
从上图可看出,TCP 和 UDP 在发送报文时所采用的方式完全不同。TCP 并不关心应用进程一次把多长的报文发送到 TCP 的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度,来决定一个报文段应包含多少个字节。如果应用进程传送到 TCP 缓存的数据块太长,TCP就可以把它划分为短一些的数据块再传送。如果应用进程一次只发来一个字节,TCP 也可以等待积累足够多的字节后再构成报文段发送出去。//UDP发送的报文长度是应用进程给出的,有长度限制
(2)TCP 连接中的套接字概念
前面已经讲过,每一条 TCP 连接有两个端点。那么,TCP 连接的端点是什么呢?
它既不是主机(IP 地址),也不是应用进程(端口号),TCP 连接的端点叫作套接字(socket)或插口。根据 RFC 793 的定义:端口号拼接到 IP 地址即构成了套接字。因此,套接字的表示方法是在点分十进制的 IP 地址后面写上端口号,中间用冒号或逗号隔开。例如,若 IP 地址是 192.3.4.5 而端口号是 80,那么得到的套接字就是 192.3.4.5:80。//套接字的概念
套接字socket = (IP地址:端口号)
2、可靠传输的工作原理
我们知道,TCP 发送的报文段是交给 IP 层传送的。但 IP 层只能提供尽最大努力服务,也就是说,TCP下面的网络所提供的是不可靠的传输。
那么,怎么样才能使得两个运输层之间的通信变得可靠呢?
理想的传输条件有以下两个特点:
- 传输信道不产生差错。
- 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。
在这样的理想传输条件下,不需要采取任何措施就能够实现可靠传输。
然而实际的网络都不具备以上两个理想条件。所以我们需要使用一些可靠的传输协议,当
出现差错时让发送方重传出现差错的数据,同时在接收方来不及处理收到的数据时,及时告诉发送方适当降低发送数据的速率。这样一来,本来不可靠的传输信道就能够实现可靠传输了。//在不理想的传输条件下需要进行差错校验+拥塞控制
(1)停止等待协议
“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
1.1无差错的情况
如下图,A 发送分组 M1,发送完后就暂停发送,等待 B 的确认。B 收到了 M1,就向 A 发送确认。A 在收到了对 M1 的确认后,就再发送下一个分组 M2。同样,在收到 B 对 M2 的确认后,再发送 M3。