传输层,包括 TCP、UDP 和 SCTP(Stream Control Transmission Protocol,流控制传输协议)。UDP 是一个简单的、不可靠的数据报协议,而 TCP 是一个复杂、可靠的字节流协议。SCTP 与 TCP 类似之处在于它也是一个可靠的传输协议,但它还提供消息边界、传输级别多宿(multihoming)支持以及将头端阻塞(head-of-line blocking)减少到最小的一种方法。
TCP
传输控制协议(Transmission Control Protocol)。TCP 是一个面向连接的协议,为用户进程提供可靠的全双工字节流。TCP 套接字是一种流套接字(stream socket)。TCP 关心确认、超时和重传之类的细节。
UDP
用户数据报协议(User Datagram Protocol)。UDP 是一个无连接协议。UDP 套接字是一种数据报套接字(datagram socket)。UDP 数据报不能保证最终到达它们的目的地。
SCTP
流控制传输协议(Stream Control Transmission Protocol)。SCTP 是一个提供可靠全双工关联的面向连接的协议。我们使用“关联”一词来指称 SCTP 中的连接,因为 SCTP 是多宿的,从而每个关联的两端均涉及一组 IP 地址和一个端口号。SCTP 提供消息服务,也就是维护来自应用层的记录边界。
ICMP
网际控制消息协议(Internet Control Message Protocol)。ICMP 处理在路由器和主机之间流通的错误和控制信息。
IGMP
网际组管理协议(Internet Group Management Protocol)。IGMP 用于多播。
ARP
地址解析协议(Address Resolution Protocol)。ARP 把一个 IPv4 地址映射成一个硬件地址。
RARP
反向地址解析协议(Reverse Address Resolution Protocol)。RARP 把一个硬件地址映射成一个IPv4地址。
用户数据报协议 UDP
应用进程往一个 UDP 套接字写入一个消息,该消息随后被封装到一个 UDP 数据报,该 UDP 数据报进而又被封装到一个 IP 数据报,然后发送到目的地。UDP 不保证 UDP 数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次。
问题:缺乏可靠性。如果一个数据报到达了其最终目的地,但是校验和检测发现有错误,或者该数据报在网络传输途中被丢弃了,它就无法被投递给 UDP 套接字,也不会被源端自动重传。
解决:如果想要确保一个数据报到达其目的地,可以往应用程序中添置一大堆的特性:来自对端的确认、本端的超时与重传等。
每个 UDP 数据报都有一个长度。如果一个数据报正确地到达其目的地,那么该数据报的长度将随数据一道传递给接收端应用进程。TCP 是一个字节流协议,没有任何记录边界,这一点不同于 UDP。
UDP 提供无连接的(connectionless)服务,因为 UDP 客户与服务器之间不必存在任何长期的关系。
一个 UDP 客户可以创建一个套接字并发送一个数据报给一个给定的服务器,然后立即用同一个套接字发送另一个数据报给另一个服务器。同样地,一个 UDP 服务器可以用同一个 UDP 套接字从若干个不同的客户接收数据报,每个客户一个数据报。
传输控制协议 TCP
首先, TCP 提供客户与服务器之间的连接(connection)。TCP 客户先与某个给定服务器建立一个连接,再跨该连接与那个服务器交换数据,然后终止这个连接。
其次,TCP 还提供了可靠性(reliability)。当 TCP 向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP 就自动重传数据并等待更长时间。在数次重传失败后,TCP 才放弃。
注意,TCP并不保证数据一定会被对方端点接收,因为这是不可能做到的。如果有可能,TCP就把数据递送到对方端点,否则就(通过放弃重传并中断连接这一手段)通知用户。这么说来,TCP也不能被描述成是100%可靠的协议,它提供的是数据的可靠递送或故障的可靠通知。
TCP 含有应用于动态估算客户和服务器之间的往返时间(round-trip time,RTT)的算法,以便它知道等待一个确认需要多少时间。另外,因为 RTT 受网络流通各种变化因素影响,TCP 还持续估算一个给定连接的 RTT。TCP 通过给其中每个字节关联一个序列号对所发送的数据进行排序(sequencing)。如果接收端 TCP 收到来自端的重复数据,它可以根据序列号判定数据是重复的,从而丢弃重复数据。
UDP 不提供可靠性。UDP 本身不提供确认、序列号、RTT 估算、超时和重传机制。
TCP 的三次握手
客户的初始序列号为 J,服务器的初始序列号为 K。ACK 中的确认号是发送这个 ACK 的一端所期待的下一个序列号。因为 SYN 占据一个字节的序列号空间,所以每一个 SYN 的 ACK 中的确认号就是该 SYN 的初始序列号加 1。类似地,每一个 FIN 的 ACK 中的确认号为该 FIN 的序列号加 1。
TCP 和 UDP 有哪些区别