先来一张全景图,3 秒快速了解整篇文章的内容。
初始传输层
前面说过,传输层的作用是建立应用程序间的端到端连接,为数据传输提供可靠或不可靠的通信服务。传输层有两个重要协议,分别是 TCP 和 UDP。TCP 是面向连接的可靠传输协议,UDP 是无连接的不可靠传输协议。
一个 IP 地址可以标识一台主机,IP 报文头部有一个字段,用来标识上层协议类型。根据这个字段的协议号,来识别 IP 传输的数据是 TCP 还是 UDP 。IP 用协议号 6 标识 TCP ,用协议号 17 标识 UDP 。但一台主机可能同时有多个程序,传输层的 TCP 和 UDP ,为了识别上一层的应用程序类型,使用端口号来识别具体的程序,从而使这些程序可以复用网络通道。
二层的帧通信和三层的包通信都是无连接的、不可靠的通信方式,四层的 TCP 却是一种可靠的通信方式。如果帧在传输中丢失,通信双方的二层功能模块发现不了;如果包在传输中丢失,通信双方的三层功能模块发现不了。燃鹅,一个 TCP 段丢失了,TCP 模块一定能够发现。一个 TCP 段的丢失,意味着一个 IP 包的丢失,因为 TCP 段是封装在 IP 包里的;同理,一个 IP 包的丢失,意味着一个帧的丢失。因此,二层和三层通信的不可靠性在 TCP 这里得到补偿。
应用程序其实就是 TCP/IP 的应用协议,应用协议大多以客户端/服务端的形式运行。客户端( Client ,使用服务的一方。)是请求的发起端。而服务端( Server ,提供服务的程序或主机。)则是请求的处理端。作为服务端的程序有必要提前启动,随时准备接收客户端的请求。否则即使有客户端的请求发过来,也无法进行处理。
确认一个请求究竟是发给哪一个服务端,可以通过收到数据包的目的端口号轻松识别。当收到 TCP 的建立连接请求时,如果目的端口号是 22
,则转给 SSH
,如果是 80
则转给 HTTP
。
TCP
TCP 是面向连接的、可靠的流协议。流就是不间断的数据,当应用程序采用 TCP 发送消息时,虽然是按顺序发送,但接收端收到是没有间隔的数据流。比如,在发送端应用程序发送了 10 次 100 字节的数据,那么在接收端,应用程序可能会收到一个 1000 字节连续不间断的数据。
TCP 为提供可靠性传输,实行顺序控制、重发控制机制。此外还有流量控制、拥塞控制、提高网络利用率等众多功能。
UDP
**UDP **是不具有可靠性的协议,可靠性功能交给上层的应用去完成。UDP 虽然可以确保发送数据的大小,比如:发送端应用程序发送一个 100 字节的消息,那么接收端应用程序也会以 100 字节为长度接收数据。但不能保证数据一定会到达。因此,应用有时会根据需要进行重发处理。
TCP 和 UDP 的区别
TCP 是可靠的传输协议,一定会优于 UDP 吗?其实不然,TCP是面向连接的,并且具备顺序控制、重发控制等机制,可以为应用提供可靠传输。而 UDP 主要用于对高速传输和实时性有较高要求的通信。比如:通过 IP 电话进行通话。如果使用 TCP ,数据如果丢失会重发,这样就无法流畅地传输通话的声音,导致无法进行正常交流。而采用 UDP ,它不会进行重发处理。也就不会有声音大幅度延迟到达的问题。即使有部分数据丢失,也只会影响小部分的通话。因此,TCP 和 UDP 需要根据应用的目的选择使用。
端口号
数据链路层和网络层的地址,分别是 MAC 地址和 IP 地址。MAC 地址用来标识同一网段中不同的设备,IP 地址标识网络中的主机或路由器。传输层的地址就是端口号,端口号用来识别同一台主机中不同的应用程序,也被称为程序地址。
一台主机可以同时运行多个程序,比如 WWW
服务的 Web 浏览器、电子邮箱客户端等程序都可同时运行。传输层协议正是利用这些端口号,识别主机正在进行通信的应用程序,并准确的传输数据。
仅仅通过目的端口来识别某一个通信是不准确的。两台主机访问的目的端口号 80
相同,可以根据源端口号区分这两个通信。
目的端口号和源端口号