好,我们直接开始今天的 TCP/IP 协议,这两个协议与我们平时网络生活中的绝大部分内容都息息相关,包括现在打开的这个博客也是通过 TCP/IP 协议来发送到你的设备上的。
1. TCP/IP 协议的四层结构
在计算机网络中共包括四层结构,从上到下分别是应用层、传输层、网络层和链路层。
应用层顾名思义就是我们的应用程序运行的层级,在这一层主要工作内容就是规定数据的格式,当然不同的应用层序可能有不同的数据格式要求,于是就产生了HTTP、HTTPS、FTP等各种各样的协议,这些协议都是属于应用层这一级的。
传输层就是我们的 TCP 协议所在的层级了,TCP 协议可以提供可靠的数据传输,在传输成会将从应用层接收到的数据包装成一个 TCP 的数据帧,继续发送到网络层;也可以将从网络层接收到的数据分发到相应的应用程序,这里区分应用程序时通过端口来区分的,每个应用程序都会分配一个端口,相应的端口号会写到数据帧的报头中。
网络层是 IP 协议所在的层级,顾名思义这一层将 IP 地址写进了 IP 数据帧的报头,并进行分组发送。
链路层就是我们物理设备的层级了,每个网卡都有一个 MAC 地址,在这一层会将 MAC 地址写进数据帧的报头,并将数据帧广播到以太网;同时这一层也会接收到以太网上发送的数据帧,并检查报头中的 MAC 地址是否匹配,如果是发给自己的数据帧则接收,并剥离出 TCP 的数据帧发送给网络层。
应用层规定数据格式,写入真正发送的数据;应用层提供可靠的数据传输,并写入端口号;网络层写入 IP 地址,进行分组发送,提供的是不可靠的数据传输;链路层写入 MAC 地址,并向以太网广播数据帧,同时也可以接收数据帧。整个数据包装就像套娃一样的一层套一层,上一层的报文是下一层的报头和报文。
2. TCP 数据帧格式
标志位:
URG:紧急标志,为 1 时表示有效,会有限处理该数据帧。
ACK:确认标志,表明确认编号栏有效,提示远端系统已经成功接收数据。
PSH:推标志,置位时接收端将不对该数据帧进行队列处理,而是尽可能的将数据转到应用处理。
RST:复位标志,重新进行 TCP 连接。
SYN:同步标志,表示同步序列号栏有效,尽在三次握手建立 TCP 连接时有效。
FIN:结束标志,表示结束 TCP 连接。
3. TCP 协议的三次握手
第一次握手:客户端主动发起连接,向服务端发送 SYN 请求(SYN=1,seq=x);服务端确认客户端发送功能正常。
第二次握手:服务端接收到客户端发送的 SYN 请求,发送 ACK 确认(SYN=1, ACK=1, ack=x+1, seq=y)客户端确认服务端接收和发送功能正常。
第三次握手:客户端接收到服务端返回的 ACK 确认信息,发送连接建立确认 ACK (ACK=1,ack=y+1)服务端确认客户端接收功能正常,连接建立。
下面看一个例子:
这是我用抓包工具抓到的一次 TCP 连接的建立过程 ,共包括三次通信,即三次握手。
橘色框内的是源IP,源端口和目的IP,目的端口。
红色框内是标志位。
紫色框内是序号。
4. TCP 四次挥手
第一次挥手:客户端发送 FIN 请求关闭连接(FIN=1,seq=u),表示客户端不再发送数据,但是还可能接收服务端发送的数据。
第二次挥手:服务端发送接收确认 ACK (ACK=1,seq=v,ack=u+1),表示服务端收到了客户端的关闭请求,不再接收客户端的数据,但仍可以向客户端发送数据。
第三次挥手:服务端发送 FIN 关闭连接(FIN=1,ACK=1,seq=w,ack=v+1),服务端表示不再发送数据。
第四次挥手:客户端发送接收确认 ACK(ACK=1,ack=w+1,seq=u+1),客户端表示知道了,完成断开 TCP 连接。