传输层介绍
传输层提供进程间的逻辑通信,传输层向高层用户屏蔽下面网络层的核心细节,使应用程序看起来好像是两个传输层实体之间有一条端到端的逻辑通信信道。
传输层运行在端系统中,传输层之间通信的基本单元是报文段,传输层常用协议TCP和UDP
传输层协议介绍
TCP:负责在通信的两个应用程序之间提供可靠的、有序的、面向连接的数据传输协议。UDP:是无连接的,尽最大可能交付,没有拥塞控制,面向报文的数据传输协议。
TCP和UDP的区别
TCP和UDP的区别:
- TCP是面向连接的协议,建立和释放需要进行三次握手和四次挥手。UDP是面向无连接的协议,无需进行三次握手和四次挥手。所以UDP实时性比TCP强。
- TCP是流式传输,没有边界,但保证顺序和可靠。UDP是一个包一个包的发送,是有边界的,但可能会丢包和乱序。
- TCP只能一对一。UDP支持一对一、一对多、多对多。
- TCP首部长度较长,首部没有使用选项字段时是20字节。UDP首部只有8哥字节,并且固定不变,开销较小。
UDP的首部格式
- 源端口:源端口号,在需要给对方回信时选用,不需要时全为0。
- 目的端口:目的端口号,在终点交付报文时使用。
- 长度:UDP用户数据报的长度,其最小值是8
- 校验和:检测UDP用户数据报在传输中是否有错,有错就丢弃。
TCP的首部格式
源端口和目的端口:各占用两个字节,分别写入源端口和目的端口。序号:占用四个字节,用于对字节流进行编号,例如序号为301,表示第一个字节的编号为301,如果携带的数据长度为100字节,那么下一个报文段的序号应为401。确认号:期望收到的下一个报文段的序号。例如B正确收到A发送来的报文段,序号为501,携带的数据长度为200字节,因此B期望下一个报文段的序号为701,B发送给A的确认报文段中确认号就为701。数据偏移:指数据部分举例报文段起始处的偏移量,实际上也就是首部的长度。确认ACK:当ACK=1时确认号字段有效,否则无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。同步SYN:在连接建立时用来同步序号。当SYN=1,ACK=0时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中SYN=1,ACK=1。终止FIN: 用来释放一个连接,当FIN=1时,表示此报文段的发送方数据已发送完毕,并要求释放连接。窗口:窗口值作为接收方让发送方设置其发送窗口的依据。
TCP的三次握手
初始状态:客户端处于closed(关闭)状态,服务器处于 LISTEN(监听)状态。第一次握手:客户端发送请求报文 SYN=1 同步序列号和初始化序列号 seq=x 发送给服务端,发送完之后客户端 SYN_SEND 状态。第二次握手:服务器收到客户端发送的请求报文后,服务器将自己的同步序列号 SYN(服务器)=1、、初始序列号 seq=y 和确认序列号(期望下次收到的数据包)ack=x+1 以及确认号ACK=1 报文作为应答,服务器处于SYN_RECEIVE 状态。第三次握手:客户端收到服务器的 SYN+ACK 之后,从ACK可以知道下次发送数据包的序列号,然后发送同步序列号 ack=y+1 和数据包的序列号 seq=x+1 以及确认号 ACK=1 确认包作为应答,客户端转为 ESTABLISHED 状态。
TCP三次握手的作用
第一次握手:确保客户端的发送能力、客户端的接收能力是正常的。第二次握手:确保服务器的接收、发送能力,客户端的接收、发送能力是正常的。但是此时服务器并不能确认客户端的接收能力是否正常。第三次握手:确保客户端的接收、发送能力正常,服务器的发送、接收能力正常。
TCP为什么需要三次握手,两次不行吗?
TCP三次握手防止客户端发送的第一次连接请求因为网络阻塞,客户端再次发送连接请求后,导致客户端和服务器建立两次连接,浪费资源。
TCP的四次挥手
初始状态:客户端和服务器都处于ESTABLISHED状态。第一次挥手:客户端发送连接释放FIN报文 FIN=1、初始序列号seq=u 给服务器,客户端发送完连接释放请求后处于 FIN_WAIT_1 状态。第二次挥手:服务器接收到客户端的连接释放FIN报文后,服务器发送 ACK=1、seq=v 以及确认号ACK=u+1 的ACK报文给客户端。服务器发送完响应报文之后处于 CLOSE_WAIT 状态。第三次挥手:当服务器不再需要给客户端发送数据时,服务器发送 FIN=1、ACK=1、seq=w以及ACK=u+1 的FIN报文给客户端,之后服务器处于LAST_ACK状态。第四次挥手:当客户端收到两个FIN报文后,向服务器发送ACK=1、seq=u+1、ack=w+1的ACK报文,之后客户端处于TIME_WAIT状态,同时客户端等待2MSL事件后处于CLOSED状态。当服务器收到客户端发送的ACK报文后处于CLOSED状态。
问题一:TCP四次挥手为什么需要四次,三次不行吗?
客户端发送FIN连接释放报文,服务器接收到这个报文后进入CLOSE_WAIT状态,这个状态为了让服务器端发送还未传送完毕的数据,传输完毕之后,服务器会发送FIN连接释放报文。
问题二:TCP四次挥手中客户端收到服务器的FIN报文之后是进入TIME_WAIT而不是直接进入CLOSED状态,同时客户端为什么进入TIME_WAIT状态后要等待2MSL才进入CLOSED状态呢?
- 确保客户端发送的所有数据都得到服务器的响应。
- 为了让连接持续时间内所产生的所有报文都从网络中消失,使下一个新的连接不会出现旧的连接请求报文。
MSL:(Maximum Segment Lifetime),最大报文段生存时间,指报文在网络中最长的存活时间,也就是报文从发送方到达接收方,并且接收方发送确认后再回到发送方的最长时间。
TCP可靠传输
TCP是可靠传输的传输层协议,指TCP协议在数据传输过程中提供了一系列机制,确保数据的完整、有序、无差错地传输到目的地。TCP协议通过以下机制来保证可靠传输:
- 确认机制:发送方将每个数据报文都标记一个唯一地序号,接收方收到数据后需要回复一个确认号,表示已经成功接收到这个数据。
- 超时重传:发送方在发送数据后会设置一个计时器,如果在规定时间内没有收到确认,则会重发数据。可以确保数据丢失也能够及时重传。
- 滑动窗口:发送方通过滑动窗口机制控制发送数据的数量和速度,接收方通过滑动窗口机制来控制接收数据的数量和速度。
- 拥塞控制:发送会根据网络状况和接收方的反馈来调整数据发送的速率,以避免网络拥塞。
TCP流量控制
流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,进而影响发送方的发送速率。将窗口字段设置为0,则发送方不能发送数据。
- 发送窗口:用来限制发送方可以发送的数据大小,其中发送窗口的大小由接收端返回的TCP报文段中窗口字段控制,接收方通过此字段告知发送方自己的缓冲大小。
- 接收窗口:用来标记可以接收的数据大小。
发送出去的数据流被分为四部分:已发送并收到确认 | 已发送但未被收到确认 | 允许发送但尚未发送 | 不允许发送,其中发送窗 = 已发送但尚未收到确认 + 允许发送但尚未发送。
接收到的数据流可以分为:已发送确认并交付主机 | 允许接收 | 不允许接收,其中接收窗 = 允许接收。
TCP拥塞控制
拥塞控制是为了降低整个网络的拥塞程度,如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。
发送方会维护一个叫做拥塞窗口(cwnd)的状态变量,同时TCP主要通过四个算法来进行拥塞控制(慢开始、拥塞避免、快重传、快恢复)。
慢开始 & 拥塞避免
发送的最初执行慢开始,令 cwnd = 1,发送方只能发送1个报文段;当收到确认后,将cwnd加倍,因此之后发送方能够发送的报文段数量为2、4、8等。
因为慢开始每个轮次都将cwnd加倍,这样会让cwnd增长速度非常快,从而使得发送方发送的速度增长速度加快,网络拥塞的可能性就比较高。设置一个慢开始门限ssthresh,当cwnd >= ssthresh时,进入拥塞避免,每个轮次只将cwnd加1。
如果出现超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。
快重传 & 快恢复
在发送方如果收到重复确认,那么说明下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个M2,则M3丢失,立即重传M3。
这种情况下,只是丢失个别报文段,而不是网络阻塞。因此执行快恢复,令ssthresh = cwnd / 2,cwnd = ssthresh,注意到此时直接进入拥塞避免。
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是cwnd的增长速率。慢开始cwnd设置为1,而快恢复 cwnd 设置为 ssthresh。