传输层
- 传输层向上面的应用层提供通信服务,属于面向通信部分的最高层,也是用户功能中的最底层。传输层为相互通信的应用进程提供了逻辑通信。主要包括两个协议:TCP协议和UDP协议。
- 传输层的主要作用:分段及封装应用层送来的数据;提供端到端的传输服务;在发送主机与接收主机之间构建逻辑通信。
1. 传输层中的端口号:
- TCP/IP协议中的端口就是逻辑端口,通过不同的逻辑端口可以来区分不同的服务。一个IP地址的端口通过16bit进行编号,最多可以有65536个端口。端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535。
- 那么规定这些端口有什么用呢?我们知道,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。那么,主机对于这些服务是怎样区分的呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”(也称插口或套接字)来区分不同的服务的。
1.1 >通过端口号识别应用:
一台计算机上同时可以运行多个应用程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。
1.2> 通过 IP 地址、端口号、协议号进行通信识别:
仅凭目标端口号识别某一个通信是远远不够的。需要通过源IP地址,目的IP地址,协议号,源端口号和目的端口号这五个元素来识别一次通信。
1.3 >端口的范围:
- 熟知端口(著名端口):由ICANN指派和控制,范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP(文件传输协议)服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。
- 注册端口:1024-49151,IANA不指派也不控制,但须注册,这些端口多数没有明确的定义服务对象,不同程序可根据实际需要自己定义。
- 动态端口(短暂端口):49152-65535,IANA不指派也不控制,无须注册。
2. TCP协议:
- TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的(通讯双方交换数据之前必须建立连接)、可靠的(多种确保可靠性的机制)、基于字节流(8bit(1Byte)为最小单位构成的字节流)的传输层通信协议。
- TCP作为一种面向连接的协议,只有确认通信的另一端存在时,才会进行数据的传输,TCP在传输的过程中,为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收,如果发送端实体在合理的往返时延内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。确保数据的可靠传输。
2.1> TCP报文段头部信息分析:
TCP报文段的数据格式如下如所示:
用Wireshark抓取的头部信息如下:
接下来我们来分析每部分的含义和作用:
- 源端口和目的端口——各占2字节。端口是运输层与应用层的服务接口,运输层的复用和分用功能都要通过端口才能实现。也表示数据从哪个进程来, 到哪个进程去。
- 序号字段——占4字节。TCP连接中传送的数据流中的每一个字节都编上一个序号,序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
- 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
- 首部长度——占 4 bit,可表示的最大十进制数值是15(一个单位为4字节),因此,TCP的首部长度的最大值是60字节。它指出 TCP 首部共有多少个4字节,首部长度可以在20~60字节之间。
- 保留字段——占 6 bit,保留为今后使用,但目前应置为 0。
- 紧急比特 URG —— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
- 确认比特 ACK —— 只有当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。
- 推送比特 PSH (PUSH) —— 接收 TCP 收到推送比特置 1 的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
- 复位比特 RST (ReSeT) —— 当 RST =1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
- 同步比特 SYN —— 同步比特 SYN 置为 1,就表示这是一个连接请求或连接接受报文
- 终止比特 FIN (FINal) —— 用来释放一个连接。当FIN =1 时,表明此报文段的发送端的数据已发送完毕,并要求释放连接。
- 窗口字段 —— 占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
- 检验和 —— 占2字节。字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上12字节的伪首部。
- 紧急指针字段 ——占2字节。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。
- 选项字段 —— 长度可变。TCP 只规定了一种选项,即最大报文段长度 MSS(Maximum Segment Size)。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”
- 填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。
2.2> TCP的三次握手:
TCP建立连接的过程称为三次握手,如下如所示:
通过Wireshark抓包来分析三次握手的过程:
第一次握手:客户端向服务器发送连接请求包,标志位SYN(同步序号)置为1,序号为Seq=0
第二次握手:服务器收到客户端发过来报文,由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号Seq=0,将确认序号(Acknowledgement Number)设置为客户的序列号加1,即Ack = 0+1=1。
第三次握手:客户端收到服务器发来的包后检查确认序号(Acknowledgement Number)是否正确,即第一次发送的序号加1。以及标志位ACK是否为1。若正确,服务器再次发送确认包,ACK标志位为1,确认序号(Acknowledgement Number)=1,发送序号为1。客户端收到后确认序号值与ACK=1则连接建立成功,可以传送数据了。
2.3> TCP的四次挥手:
TCP断开连接的四次挥手,如下图所示:
通过Wireshark抓包来分析四次挥手的过程:
第一次挥手:客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。将标志位FIN和ACK置为1,如图,序号为Seq=318,确认序号为Ack=130。
第二次挥手:服务器收到FIN后,发回一个ACK(标志位ACK=1),确认序号为收到的序号加1,即Ack=318+1=319.
序号Seq为收到的确认序号130。
第三次挥手:服务器关闭与客户端的连接,发送一个FIN和ACK。标志位FIN和ACK置为1,序号为Seq=130,确认序号为Ack=319。(与第二次挥手的序号和确认号相同)
第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认序号为收到的序号加1,即130+1=131。
序号为收到的确认序号131。
3. UDP协议:
- UDP是一种无连接,不可靠的协议。
- 并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况,UDP 也无法进行流量控制等避免网络拥塞行为。
- 此外,传输途中出现丢包,UDP 也不负责重发。甚至当包的到达顺序出现乱序时也没有纠正的功能。
- UDP 常用于一下几个方面:1.包总量较少的通信(DNS、SNMP等);2.视频、音频等多媒体通信(即时通信);3.限定于 LAN 等特定网络中的应用通信;4.广播通信(广播、多播)。
UDP报文段头部信息分析:
UDP报文段的数据格式如下如所示:
用Wireshark抓取的头部信息如下: