传输层协议简述
本篇主要介绍TCP协议以及UDP协议两种协议的内容以及特性,重点介绍了传输层协议的三次握手、四次挥手,同时介绍一些常见协议和相对应端口。
一、TCP协议的特性
- 工作在传输层
- 面向连接协议
- 全双工协议
- 半关闭
- 错误检查
- 将数据打包成段,排序
- 确认机制
- 数据恢复,重传
- 流量控制,滑动窗口
二、UDP协议的特性
- 工作在传输层
- 提供不可靠的网络访问
- 非面向连接协议
- 有限的错误检查
- 传输性能高
- 无数据恢复特性
三、PID与端口号
PID与端口号:系统每启动一个进程,系统都会分配一个标志给这个程序,也就是PID(系统中的编号)。其次会分配给进程分配一个端口号。PID在不同主机中的编号并不相同。
端口号作用:确定系统中的进程
端口号的分类:
- 规定好的,固定的端口号。(比如80端口号为http协议的端口号)
- 系统可以随机分配的端口号。(客户端在访问服务端时,系统会自动随机分配一个端口号)
- 人类可以自由使用的端口号。(新开发的程序规定的端口号且端口号之前没有被使用过)
四、TCP协议的首部报文
1、源端口、目标端口:
算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。
计算机的端口个数为2^16个,即 65536 (0-65535)
2、序列号: 表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。
由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0开始无限循环。
3、确认号(ask) 表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。
举例:如果主机A需要给主机B发送数据包,主机A发送的确认号为0,那么主机A期望主机B回复数据包时需要发送一个数据包的序号为0+1的数据包。
4、首部长度/数据偏移: 表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。
该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
5、控制位: 设备之间进行通讯,建立连接的状态由控制位决定。连接状态通常有三种:请求连接;建立连接;断开连接
-
URG(紧急位):表示本报文段中发送的数据是否包含紧急数据。当URG=1时后面的紧急指针字段(urgent pointer)才会生效。
-
ACK(确认位):表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
-
PSH(急切位):提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
-
RST(重置位):如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段
-
SYN(同步位):在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1, 带SYN标志的TCP报文段称为同步报文段 。
-
FIN(断开位):表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了。”
-
校验和:提供额外的可靠性紧急指针:标记紧急数据在数据字段中的位置。
-
选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节
五、TCP的连接
5.1、TCP连接(三次握手)
首先,先给大家一张两台PC进行通讯的三次握手内容图进行分析:
为什么要三次握手?
数据要有去有回, PC1发送给PC2报文后,PC2进行回复,PC1还需要对PC2的回复再进行一次回复。
如上图所示,PC1为客户端,PC2为服务端,PC1需要向PC2进行请求建立连接
第一步:PC1会发送一个请求建立连接的报文,这个报文包含以下几个内容:
- 报文的序号(Seq=x)
- 同步位由于PC1和PC2还没有建立连接,处于请求建立连接的状态,所以同步位SYN=1,确认位ACK=0.
第二步:PC2收到PC1请求建立连接的报文后,同意与PC1建立连接,所以需要回复一个报文给PC1,PC2发送的报文内容有以下几点:
- 报文的序号(Seq=y)
- Ack确认号为x+1,即PC2需要PC1回复一个报文序号为x+1的报文
- 控制位 SYN=1 ACK=1 PC2同意PC1请求建立连接的请求,即确认位为1,同步位为1
第三步:PC1收到PC2的回复报文后
- 会发送一个报文序号为x+1的报文,即Seq=x+1
- Ack确认号为y+1,即希望PC2下一次回复消息的报文序号为y+1
- 最后将ACK=1封装进数据包中,这时候PC1与PC2已经建立连接同步位SYN=0
5.2、TCP断开(四次挥手)
下图为TCP断开连接的图片解析:
客户A和服务器B都处于建立连接的状态,此时客户A主动与服务器B发出断开连接的请求: 第一步:客户A会发送一个序号为Seq=u的报文给服务器B,此时控制位中的断开位FIN=1,即请求与服务器B断开连接。(PS:此时客户A处于等待断开连接的状态,服务器B的数据传送未结束)
第二步:服务器B需要先将数据传输全部传输结束才能同意断开连接,服务器B会进行下面两步操作:
2.2 服务器B会回复一个报文序号为v的报文给客户A(Seq=1)
需要客户A能回复一个报文序号为u+1的报文给服务器B(确认号ack-u+1)
此时服务器B与客户A仍处于建立连接的状态所以控制位的确认位ACK=1
2.3 服务器B同意了客户A的断开连接请求:服务器B会回复一个同意断开连接的报文:
服务器B发出的报文的序号为w(Seq=w)
需要客户A回复一个报文序号为u+1的报文给服务器B(Ack=u+1)
此时的控制位中,断开位FIN=1,确认位ACK=1(2个控制位表示同意断开连接)
第三步:客户A接收完服务器传输的数据后,收到了服务器B的同意断开连接请求,这个时候客户A会发送一个确认报文给服务器B:
按照服务器B要求,客户A回复了一个报文序号为u+1的报文给服务器B(Seq=u+1)
控制位中确认位为1(ACK=1)
需要服务器B回复客户A一个报文序号为w+1的报文给客户A(此时客户A与服务器相当于完全断开连接,所以客户A最后发送的报文将会被服务器B拒收,服务器B将不再回复客户A)
六、扩展:有限状态机
1、CLOSED 没有任何连接状态 2、LISTEN 侦听状态,等待来自远方TCP端口的连接请求 (服务开启 http(进程) 80端口在帮进程 看着 有没有人找 http ) 3、SYN-SENT 在发送连接请求后,等待对方确认 4、SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认 5、ESTABLISHED 代表传输连接建立,双方进入数据传送状态 6、FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认 7、FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求 8、TIME-WAIT 完成双向传输连接关闭,等待所有分组消失 9、CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认 10、LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失 11、CLOSING 双方同时尝试关闭传输连接,等待对方确认
七、TCP超时重传
异常网络状况下(开始出现超时或丢包),TCP控制数据传输以保证其承诺的可靠服务。
TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为每个TCP报文段都维护一 个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答, TCP模块将重传TCP报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重 传,就是TCP的重传策略
总结
本章的重点主要是理解,TCP与UDP协议的特性和优缺点对比,重点理解传输层中TCP的三次握手中控制位处于什么状态以及变化。