传输层比较重要的两个协议是TCP和UDP协议。
1.TCP
TCP是一种可靠的、面向连接的全双工传输层协议。
TCP的报文格式是这样的:
源端口(2字节):源主机应用程序使用的端口号。源端口和IP地址用作标识报文的返回地址。
目的端口(2字节):目的主机应用程序使用的端口号。
序号(4字节):seq序号,标识发送方向接收方发送的数据段的序号。
确认序号(4字节):Ack序号,接收方应答的序号,为接受到的序号+1。
头长度(4字节):表示i头部占4字节的数目。
URG:是否为紧急指针,0为不是,1为是。
ACK:请求或者应答连接,用于确认序号有效。
PSH:最快速度传输数据。
RST:重建会话。
SYN:同步连接序号,用于建立连接。
FIN:结束连接,为0是请求结束连接,为1是结束连接。
窗口大小(2字节):接收方告诉发送方想接收到的每个数据段的大小,可用于流量控制。
校验和(2字节):对头部和数据进行校验。
紧急指针:当URG为1时生效,表示这个数据是紧急数据,优先发送。
选项:用于记录路由或者时间戳之类的可选任务。
TCP传输数据分为三个过程:建立连接、传输数据、关闭连接。
建立连接的过程是一个三次握手的过程,首先,客户端发送一个标识为SYN,序列为seq=a的数据包,服务器端收到后,要对这个包进行确认,便回复一个SYN,ACK,Ack=a+1,seq=b的数据包,客户端收到这个包之后,进行确认,回复一个ACK,seq=a+1,Ack=b+1的包,这样就建立连接了。
注意:ACK是标志位的,用于确认序号有效。Ack是确认序号,是seq+1。
接着就开始传输数据。
数据传输结束后开始进行关闭连接,即TCP四次挥手。假设客户端想终止这个连接,于是发送一个数据包:FIN,ACK,seq=a,服务器端收到之后,进行确认回复ACK,seq=b,Ack=a+1,确认完客户端的终止连接之后,服务器端再进行终止连接,向客户端发送数据包为:FIN、ACK,seq=b,Ack=a+1,客户端收到之后,知道服务器端也终止连接然后进行确认回复:ACK,seq=a+1,Ack=b+1,这样会话就关闭了。
2.UDP
UDP是一种不可靠的、无连接的传输层协议,他不像TCP一样需要三次握手四次挥手,UDP不需要事先建立连接,因此也无法保证数据的可靠。
UDP报文的头部是这样的:
源端口(2字节):初始化通信的端口号。
目的端口(2字节):接收方应用程序的地址接口。
UDP数据包长度(2字节):UDP头和数据的总长度。
校验和(2字节):数据包的头部和包内容的校验。
使用UDP发送数据时,应用程序需要提供报文到达确认、排序、流量控制等功能,UDP没有像TCP一样的重传机制,占用资源小,处理效率高。一般用来传输语音、视频等。
对比