一、传输层
1. 传输层概述
传输层是OSI模型当中的第四层,主要负责在网络的两个节点中提供可靠的数据传输服务。实现端到端(进程和进程之间)的数据传输。传输层提供的传输是逻辑传输,也就是向应用层屏蔽了下面网络层的细节和具体实现,使得应用程序的数据传输是在传输层和传输层之间水平实现的,实际上并没有这样的物理连接。
2. 传输层工作原理
传输层会将从上层(应用层等)接收到的数据进行切割为多个数据单元,再将数据单元加上头部信息进行封装,通过网络传给目标主机的传输层后,会将头部信息和数据单元拆分开,按照顺序重新组合恢复数据,提供给上层。
3. 传输层常见名词
- 协议:传输层在TCP/IP协议族中有两个重要的协议,TCP协议(传输控制协议)和UDP协议(用户数据报协议)。
- 进程:正在运行的应用程序。
- 端口:传输层的TCP和UDP为了识别出所传输的数据是发送给哪个进程,设定了一个程序的编号,这个编号就是端口。
- 端口号总长16比特,范围也就是0~65535。0一般不用,所以允许有65535个不同的端口号。
- 公认端口:0~1023,明确与某种服务绑定,比如各种协议。
- 注册端口:1024~65535:松散的绑定一些服务,也就是有许多服务绑定这些端口。
- 一个端口只对应一个进程,但是一个进程可以有多个端口。
二、TCP协议
1. TCP概述
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP/IP协议族中,TCP协议是基于网络层的IP协议。IP协议是一个不可靠的协议,也就是不能够保证数据传输的可靠性,而TCP协议给IP协议提供了一个可靠的环境;IP协议解决了数据的传输路由和地址问题,TCP协议就不用再关心路由和寻址。
2. TCP数据段
数据段是传输层传输数据的基本单元,TCP数据段主要分为TCP头部和上层数据分割后获得到的数据单元。头部包含了控制TCP行为的各种字段,而数据部分则承载实际要传输的数据。下面是TCP数据段的主要内容:
- 源端口号(Source Port):16位,标识发送端的端口号。
- 目的端口号(Destination Port):16位,标识接收端的端口号。
- 序列号(Sequence Number):32位,用于标识从TCP源端向目的端发送的字节流中的每个字节的序号。这个序号确保了数据的有序传输。
- 确认号(Acknowledgment Number):32位,当TCP段不包含数据时,这个字段表示接收端期望收到的下一个字节的序列号。如果包含数据,则表示对已成功接收数据的确认。比如确认号是101,表示前100个字节已经收到了,希望下次能够从第101个字节开始。
- 数据偏移(Data Offset):4位,这里的偏移是指TCP数据段中实际数据距离TCP数据段起始位置的长度,也就是TCP数据段的头部长度。所以这个字段可以被叫做头部长度(Heading Length)。
- 保留(Reserved):6位,保留位,目前必须置为0。
- 控制位(Control Flags):6位,也称为标志位,用于控制TCP的行为,描述了两端节点当前的状态。包括:
- URG(紧急位、Urgent Pointer field significant):表示紧急指针字段是否有效,当URG=1时,紧急指针字段有效。
- ACK(确认位、Acknowledgment field significant):表示确认号字段是否有效,当ACK=1时,确认号字段有效;ACK=0时,确认号字段无效。
- PSH(急迫位、Push Function):提示接收端应尽快将这个报文段交给应用层。
- RST(重置位、Reset the connection):用于重置由于某种原因出现错误的连接。
- SYN(同步位、Synchronize sequence numbers):用于建立连接,在建立连接时用来同步序列号,以开始一个新的连接。SYN为1表示希望建立连接。
- FIN(结束位、No more data from sender):用于断开连接,表示发送端已经发送完所有数据,请求释放连接。当FIN=1时,告诉对方数据发送完成,可以断开连接。
- 窗口大小(Window Size):16位,用于流量控制。它告诉发送端接收端还能接收多少数据。
- 检验和(Checksum):16位,用于错误检测。它覆盖了整个的TCP段,包括TCP头部、数据和TCP伪头部。
- 紧急指针(Urgent Pointer):16位,仅当URG控制位被设置时才有效。它指出了包中的紧急数据的结束位置。
- 选项(Options):可变长度,用于各种附加功能,如最大报文段大小(MSS)、窗口缩放、选择确认(SACK)、时间戳等。
- 数据(Data):实际传输的数据内容,其长度由数据偏移字段决定。
3. TCP建立连接(三次握手)
TCP在传输数据前创建连接的过程本叫做三次握手,客户端和服务端间的交互需要涉及三个报文。
- 第一次握手:客户端发送一个序列号seq=X和同步位SYN=1的报文给服务端,请求建立连接。
- 第二次握手:服务端收到客户端的连接请求后,会回复一个序列号seq=Y、同步位SYN=1和确认位ACK=1的报文给客户端,表示同意建立连接。
- 第三次握手:客户端收到服务端的同意连接后,会再发送一个序列号seq=X+1、确认号ack=Y+1和确认位ACK=1的报文给服务端,表示收到确认报文。完成三次握手,两端完成连接的建立。
之所以要进行三次握手,是因为网络要双向互通,三次握手可以保证双方正常通信。第一次握手确保客户端的发送能力正常,第二次握手确保服务端的接收能力正常和发送能力正常。第三次握手确保客户端的接收能力正常。
4. TCP断开连接(四次挥手)
当数据完成传输,客户端和服务端不再有数据传输的需求,就会断开TCP连接。该过程被称为四次挥手,客户端和服务端间的交互涉及四个报文。
- 第一次挥手:客户端发送一个序列号seq=U和结束位FIN=1的报文给服务端,告诉服务端数据发送完成,可以断开连接。
- 第二次挥手:服务端接收到断开连接的需求后,会回复一个序列号seq=V、确认号ack=U+1和确认位ACK=1的报文。
- 第三次挥手:服务端传输数据完成后,会发送一个序列号seq=W、确认号ack=U+1和结束位FIN=1的报文给客户端。
- 第四次挥手:客户端收到后,会发送一个序列号seq=U+1、确认号ack=W+1和确认位ACK=1的报文给服务端。
三、UDP协议
1. UDP概述
UDP是一种无连接的传输层通信协议,提供面向事务的简单不可靠传输的传输层协议。和TCP协议不同,不能够给数据提供传输保障,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
2. UDP数据段
UDP数据段主要分为UDP头部和来自上层的实际数据,与TCP数据段相比,构成简单,包括以下内容:
- 源端口号(Source Port):16位,标识发送端的端口号。如果发送端不是由用户应用程序指定端口,则此字段可以是0,表示无端口。
- 目的端口号(Destination Port):16位,标识接收端的端口号。
- 长度(Length):16位,指定UDP数据报的长度,包括UDP头部和UDP数据的长度。如果计算结果为奇数,需要在数据部分填充一个字节,以确保整个数据报的长度是8字节的倍数。
- 校验和(Checksum):16位,用于错误检测,覆盖UDP头部、UDP数据以及一个假想的UDP伪头部。如果校验和为零,表示没有进行校验和计算。
- UDP伪头部是在计算校验和时使用的,它包含以下内容:
- 源IP地址:32位,发送端的IP地址。
- 目的IP地址:32位,接收端的IP地址。
- 协议(Protocol):8位,指定了传输层协议,对于UDP来说,这个值是17。
- UDP长度:16位,UDP数据报的长度,不包括伪头部。
- 伪头部仅在计算校验和时使用,并不实际在网络中传输。它的目的是让UDP校验和能够覆盖到IP头部的一些关键字段,从而提供端到端的错误检测。
- UDP伪头部是在计算校验和时使用的,它包含以下内容:
- 数据(Data):实际的数据部分。
四、TCP和UDP的区别
- TCP协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议,但传输速率慢,可靠性高。
- UDP协议:是一种无连接的、不可靠的、基于数据报文段的传输层通信协议,但传输速率高,可靠性低。