在当今因特网的层次结构中,传输层的协议主要有两种,其一为Transmission Control Protocol,即TCP;其二为User Datagram Protocol,即UDP。
1、TCP service model
TCP是使用最广泛的传输层通讯协议,它在两个端系统之间建立连接,并通过两端的状态机来维护连接,为应用层提供可靠的字节流传输服务。
(1)TCP是面向连接的
在传输实际数据的字节流之前,两个端系统的TCP会通过三次握手来确定建立连接,即所谓的3-way handshake
在上图所示的情形中,主机A试图与主机B建立TCP连接,A会首先发一个SYN(Synchronize)信号和一个用于字节流识别的基数到B申请建立连接。如果B同意,那么B会返回一个SYN信号和A之前所发的基数,以及一个ACK(acknowledgement)表示同意建立连接并确认基数。这时,A会回复一个ACK信号到B,表示接受。至此,两端表征连接状态的状态机被初始化,双向的连接就已经建立起来,就等待字节流的传递。
在数据传输完成之后,并且TCP连接被要求解除(teardown),两端的传输层会通过所谓的四次挥手来解除连接关系。
主机A认为它不会再向B发送数据之后,请求关闭连接,A会向B发送一个FIN(Finish)信号。B接到这个信号后,会回复ACK到A,这时B会关闭从A来的数据流。A——>B的数据流被关闭,但是B可能还有数据要发往A,所以B还会发送数据到A,直到发送完成。此后,B会发送一个FIN到A申请终结连接,A会发送一个ACK表示同意。至此,A、B间的双向连接被关闭。至于A、B知道什么时候该发什么信号,是由其背后的状态机决定的。连接解除后,两端的状态机也被删除。
(2)TCP字节流的基本单元——TCP报文段(Segment)
根据网络中的分组交换原则,TCP字节流被划分成多个TCP报文段。一个TCP报文段,主要有首部和数据两部分。首部的各个域描述了该报文段的性质,数据则是来自应用层的数据,如HTTP请求。TCP报文段生成之后,将会交付网络层进行下一步处理。
TCP报文段的结构:
源端口和目标端口的作用:发送数据和回复信息的目标位置
序列号和确认序列号:序列号用于检查传输数据的完整性,并用于按序重构数据;确认序列号用于表示接收方正在等待的下一个数据序列号,以保证每个数据段都被接收。
求和检查(Checksum):用于检查数据是否出现错误,如果有会要求重新发送。
窗口规模:用于流量控制,避免接收方被淹没。
(3)可靠的数据传输保证机制
上述重点字段保证的数据确保递交到位机制、数据正确性检查机制、流量控制机制,还有通过多字段保证的TCP连接身份识别机制。
2、UDP service model
与TCP比较,UDP的服务模型要简单很多,以至于被认为是只指定传输端口的传输层协议。
UDP不会建立连接,不保证数据送达(忽略丢包),也没有Sequence number来保证数据的正确顺序。它只有单向的传输,而不会有双向的交流。
UDP最大的优点是简单,那些不需要确保递交、流量控制、按需递交的应用,通常会选择UDP作为其传输层协议。如DNS。
(3)小结
这篇随笔浅谈了一下传输层的两个协议——TCP和UDP,说到了它们的性质和运行机制,各自的优势。
总的来说,TCP是面向连接的传输层协议,它通过诸多字段和双向交流,来给应用层提供可靠的字节流传输服务。在传输数据之前,要通过三次握手建立状态机和连接;传输数据之后,要通过四次挥手解除连接。为了将所有数据传输到目的地,TCP通常会重新发送数据段。而UDP则更加简单,只负责将数据段递交给网络层,没有建立连接的过程,不会去维护状态。
才疏学浅,还有待进步,欢迎大家交流。