面向连接的服务和无连接服务
面向连接的服务:通信双方需在通信前建立连接。这种通信过程分为三个阶段:第一阶段是建立连接。第二阶段是连接成功建立之后,进行数据传输。第三阶段是在数据传输完毕后,释放连接。
无连接是指通信双方不需要事先建立连接,而是把带有目的地址的包(报文分组)直接发送到线路上,由网络进行传输,也不需要目标方进行回复。
面向连接的服务可实现两个终端系统间传输的报文无差错、无丢失、无重复、无乱序。
无连接服务传输效率更高,开销更小,但是无法保证数据传输可靠性。
端口号和套接字
传输层是面向通信进程的,同一主机上可同时有多个进程在通信。IP地址只能区分主机,无法区分主机中的通信进程。
端口可理解为传输层地址,它使用整数表示,取值范围0~65535,称为端口号。它用来区分主机中的通信进程。
0~1023是公认端口,它们被一些公认的服务所占用。如:FTP-21、HTTP-80、DNS-53等等。
其它的应用程序可自己指定使用的端口,也可使用系统随机生成的端口进行通信。
套接字(Socket):是IP地址+端口号组成的地址,用于寻址主机中的通信进程,常用于通信程序设计。如:192.168.1.1:80。
TCP协议
TCP协议:传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层协议。对可靠性要求高的应用都使用TCP协议进行传输控制。
TCP数据报
TCP数据报需要封装在IP数据报中进行传输。
序号和确认号用来标识数据报的顺序和拼接位置。
标记字段中定义了多个标记位,包括ACK、PSH、SYN、FIN等,用来标记该数据报的用途及状态。
TCP协议的工作过程
- 建立连接
- 传输数据
- 释放连接
以用户访问服务器中的一个网页为例
Web服务使用HTTP协议,端口号为公认端口80。客户端进程的端口号为系统随机生成,此处假设为1025。
第一步:建立连接
此过程需要传递三个不带数据的TCP数据报,它们带有不同的标记位,称为“三次握手”。
- 客户机发送一个带有 SYN 标记的TCP请求包。
- 服务器回送一个带有 SYN 和 ACK 标记的请求确认包。
- 客户机再发送一个带有 ACK 标记的确认包。两者间的连接建立成功。
第二步:传输数据
客户机向服务器发送HTTP请求报文,服务器向用户发送请求的网页。
这次传输的TCP数据报内会封装相应的数据。
- 客户机发送一个带有 PSH 和 ACK 标记的TCP包,里面含有HTTP请求。
- 服务器回送一个带有 ACK 标记的TCP包,里面含有网页数据。如果是最后一个数据包,会添加 PSH 标记。
这个传输过程可能会进行多次。
第三步:释放连接
通信结束后,进入释放连接阶段。此过程传递的TCP数据报不带数据。
以上图示是模拟环境下TCP连接的释放过程。实际应用中的释放过程比这个要复杂。
查看演示
TCP协议的功能
保证数据的可靠传输:可保证传输的数据不丢失、不乱序。
具有流量控制能力:如果发送方速度过快,导致接收方来不及接收,接收方可要求发送方减慢速度或暂停发送。
具有拥塞调节能力:发送方可根据网络的拥塞情况调整发送速度,避免拥塞的发生。
UDP协议
UDP协议比TCP协议要简单得多,它是无连接的,不保证数据传输的可靠性。它的开销很小,实时性强。
UDP数据报的首部只有8个字节,只标识了必要信息。
UDP协议的工作过程
UDP协议的工作过程也非常简单,只是把打包的数据发送到网络中就行了,没有多余的动作。
以DNS查询为例:
DNS协议用于向DNS服务器查询域名对应的IP地址,使用的端口号是53。DNS协议既可以使用TCP协议也可使用UDP协议,大部分情况都是使用UDP协议。
查询过程
两者只需经过两次通信即可。有些UDP应用不需要用户响应,可以只经过一次传输。