本文作者林箖霖,转载请注明出处~
运输层知识点
一、运输层概述
(1)运输层的主要功能:为应用进程之间提供端到端的逻辑通信; 运输层需要对收到的报文进行差错检测;运输层使用两种协议TCP和UDP。
(2)TCP是面向连接的,提供可靠服务;UDP是面向无连接的,提供不可靠服务。
(3)运输层使用端口号来标记应用进程,16bit来表示。
(4)服务器端口:熟知端口:0~1023,登记端口:1024~49151;
(5)客户端口(短暂端口号):49152~65535。
1.1 TCP的特点
- 面向连接,面向字节流(对上层交付的数据以字节流传输)
- 提供可靠交付
- 为点对点的连接提供可靠的全双工通信
- 首部有20字节,并且还有40字节的扩展首部,拓展首部可以放时间戳、选择确认SACK、窗口扩大,MSS
- 拥有拥塞控制与流量控制
1.2 UDP的特点
- 面向无连接,面向报文(对上层交付的数据直接添加UDP首部就向下交付)
- 提供尽最大努力交付的服务
- 支持一对一,一对多,多对一和多对多的交互通信
- 首部只有8个字节(首部开销小)
- UDP首部字段:源端口,目的端口,长度和检验和。源端口和目的端口分别完成分用和复用的功能。使用校验和的时候需要添加12个字节的伪首部参与计算过程。
二、 TCP的三次握手过程?
- 一开始,客户端和服务器都处于
close状态
。先是服务器主动监听某个端口,处于listen状态
。 - 当要建立连接的时候,客户端会给服务器发送
SYN=1, Seq_num=client_isn
的报文(Seq_num是随机选取的一个序号),并且客户端进入SYN-Sent状态。 - 服务器接收到这个报文后,如果同意建立连接,那么服务器会给客户端回复一个
SYN=1,ACK=1, Seq_num=server_isn, ack=client_isn+1
的报文,并且服务器进入SYN_RCVD状态,并等待客户端的ACK报文,才可以建立连接。 - 客户端收到这个报文之后,便回复一个
ACK=1, Seq_num=client_isn+1, ack=server_isn+1
的报文,发送完这个报文后,客户端就进入连接状态。服务器收到客户端的ACK报文后,便进入连接状态。
2.1 为什么要三次握手?
进行三次握手的原因主要是阻止重复历史连接的初始化。如果没有进行三次握手,而是进行两次握手,那么当服务端收到来自客户端的请求连接SYN报文后,便会马上进入连接状态,那么假设这个报文是网络中的一个迟到的连接报文,此时的客户端并不想建立,那么服务端的资源就会被白白浪费。(如果是三次握手的话,客户端收到服务器端的SYN+ACK报文后,会查看确认号
,如果是一个对过期连接的回复SYN+ACK,那么客户端会发送一个RST报文中止这个连接
。通过这个处理方法,也可以知道三次握手的原因还有一个是为了同步序列号
。)
三、 TCP的四次握手释放连接过程
- 一开始客户端和服务端都处于连接状态,此时客户端想要断开连接,那么他就会给服务器发送一个
FIN=1, Seq_num=client_isn
的报文,并且客户端进入FIN_WAIT1状态。 - 服务器收到客户端的FIN报文之后,便知道客户端想要终止连接,他就会先给客户端回复一个
ACK=1,Seq_num=server_isn, ack=client_isn+1
的报文,并且服务端进入CLOSE_WAIT状态。此报文只是对客户端发送的FIN报文的一个确认,因为此时可能服务器器还有数据没有发送完毕。 客户端接收到服务器的ACK报文后,客户端会进入FIN_WAIT2状态,等待服务器的FIN报文。 - 等到服务端的数据发送完了之后,才会向客户端发送
FIN=1, ACK=1, Seq_num=server_isn2, ack=client_isn+1
的报文,并且服务器进入LAST_ACK状态,等待客户端的最后的ACK报文。 - 客户端收到服务端的ACK+FIN报文之后,给服务器发送最后一个
ACK=1, seq_num=client_isn+1, ack=server_isn_w+1
的报文,并且客户端进入TIME_WAIT状态。等待2MSL时间后,如果没重新接收到服务器的FIN=1, ACK=1
的报文,则客户端进入断开连接状态。
TIME_WAIT状态是一个2MSL的时间,也就是两倍的最大报文传输时间。
- 服务器接收到客户端发的最后一个
ACK报文
,服务器才能正常进入断开连接状态。
3.1 为什么是四次握手释放连接?
因为释放连接的过程,可能服务端还有数据要发送,不能马上断开连接,所以FIN和ACK不能同时发送给客户端,需要分两次发送。
3.2 2MSL的作用?
第一个是为了让服务端能够正常断开连接。因为服务端要收到客户端的最后一个ACK才可以断开连接。那么万一客户端的最后一个ACK在网络中丢失了,那么服务端在计时器的时间之内没有收到客户端的最后一个ACK时,会给客户端重新发送FIN+ACK的报文
,此时在2MSL的时间内,客户端接收到服务端的重发FIN+ACK报文后
,就知道最后的ACK报文丢失了,便重新给服务端发送ACK报文
,此时的服务端收到最后一个ACK报文后,便可以正常断开连接。
第二个是为了阻止网络中的“已失效的连接请求报文”出现在本连接中,因为经过2MSL时间后,所有本连接时间内产生的所有报文都从网络中消失。
四、 如果客户机在连接过程中出现故障了怎么办?
TCP有一个“保活计时器”,当服务端没有收到客户端的数据时,会启动“保活计时器”
,当计时器时间结束后(一般为2小时),就会给客户端发送一个探测报文,以后每隔75秒发送一次,若一连发送10个探测报文段仍没收到客户端的回应,那么就认为客户端出了故障,接着就关闭这个连接。
五、 其他关闭连接的方法
当接收到RST=1的报文,那证明连接中出现了严重错误,需要释放连接,再重新建立连接。RST还可以用来拒绝一个非法报文或者打开一个连接
六、 关于seq_num
在双方通信中,若该报文没有携带数据,则不消耗序号。但是SYN,ACK,FIN报文即使没有携带数据,也要消耗一个序号