TCP/IP 协议采用4层结构,分别是应用层、传输层、网络层和链路层
提出疑问: 一个主机的数据要经过哪些过程才能发送到对方的主机上?
链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据;
以太网规定一组电信号就是一个数据包,一个数据包被称为一帧, 制定这个规则的协议就是以太网协议。
所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。
网络层:定义IP地址,确认主机所在的网络位置,并通过IP进行MAC寻址,对外网数据包进行路由转发;
网络层引入了三个协议,分别是IP协议、ARP协议、路由协议。
IP协议还引入了子网掩码, IP地址和子网掩码通过按位与运算后就可以得到网络地址。
网络层的主要工作是定义网络地址,区分网段,子网内MAC寻址,对于不同子网的数据包进行路由。
传输层:定义端口,确认主机上应用程序的身份,并将数据包交给对应的应用程序;
传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议可以保证数据传输的可靠性。
应用层:定义数据格式,并按照对应的格式解读数据。
总结:
当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。
TCP/IP 建立连接需要3次握手
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
------------------客户端发送信息告诉服务器在吗?我要跟你建立连接
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
-------------------服务端回复 在,好。可以建立
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
-------------------客户端说,那我就开始建立了。
TCP/IP 关闭连接需要4次挥手
第一次挥手:客户端发送报文,标志位 FIN =1,Seq = n,此时客户端进入到 FIN_WAIT_1 状态,表示客户端没有数据要发送给服务器
-------------------客户端没有数据要发送给服务器,我打算关闭了
第二次挥手:服务端收到客户端发送的 FIN 报文,然后向客户端发送一个报文,设置标志位为 ACK =1 ,确认序列号为Ack = n+1 ,这是服务端进入 CLOSE_WAIT 状态.表示客户端到服务端的发送连接已经断开。
-------------------服务端说,知道了,你断开吧
第三次挥手:服务器发送报文到客户端,报文标志位 FIN =1 序列号为 Seq = m,用来关闭服务器到客户端的数据传输,服务端进行 LAST_ACK 状态
-------------------服务端说, 我也打算关闭了
第四次挥手:客户端收到服务器发送的标志位为 FIN 的报文,客户端进入到 CLIENT_WAIT 状态,等待2MSL时间。然后发送一个标志位为 ACK = 1 的报文,确认序列号为 Ack = m+1 。完成四次挥手。
-------------------客户端说, 你关闭吧
客户端发送的第4次握手报文,服务器没有收到。这时候服务器端会再次发送一个 FIN =1 的报文,而这个时候客户端还处于 CLIENT_WAIT 状态,所以可以再次发送确认消息。