TCP/IP协议是一个分层联网协议。它包含IP和位于其上的其他协议层。
TCP/IP协议具有一个重要原则——封装。其关键概念为:低层不会对高层传来的信息进行解释。
当信息从高层传向低层,会加一层本层的头信息。而信息从低层传向高层时,会有一个解包的过程。
一个应用A向应用B传输信息的大致过程
封装为 包 封装为 帧 检查 IP 头部 若匹配,剥离 IP 头部,将段交给传输层。
添加 IP 头部 添加 帧头和帧尾 若不匹配且本机为路由器,则重新路由转发
| | |
应用A->传输层->网络层->数据链路层->网络介质->数据链路层->网络层->传输层->应用B(接收数据)
| | | |
添加 传输层头部 比特流 剥离帧头和帧尾 检查端口号,确定目标应用
封装为 段 或 数据报。 校验帧完整性 剥离传输层头部,将原始数据交给应用层。
高层 低层 低层 高层
IP是一种无连接和不可靠的协议。它不保证包到达的顺序和发送的顺序一致。也不保证不会重复发送和到达接收者。网络的可靠性由如TCP一样的可靠传输层协议维护。
TCP是一种面向连接的、可靠的传输协议。 它需要先建立连接,后传输数据。
TCP通过三次握手建立连接,通过四次挥手终止连接
三次握手
-
客户端向服务器发送一个带有标志位
SYN
的数据包,表明自己希望与服务器建立连接。 客户端的TCP状态变为
SYN_SENT
-
服务器回复一个带有标志位
SYN
和
ACK
的数据包,表示同意建立连接。 服务器的TCP状态变为
SYN_RECEIVED
-
客户端接收到服务器的
SYN-ACK
包后,回应一个
ACK
包,表示连接建立。 服务器和客户端的TCP状态都变为
ESTABLISHED
,连接建立。
三次握手
服务器: LISTEN -> SYN_RCVD -> ESTABLISHED
客户端: CLOSED -> SYN_SENT -> ESTABLISHED
四次挥手
-
主动方向被动方发送一个带标志位
FIN
的数据包,表示自己想要终止连接。 主动方进入
FIN_WAIT_1
状态。
-
被动方收到
FIN
包,回应一个
ACK
包,表示确认收到关闭请求。 被动关闭方进入
CLOSE_WAIT
状态。 主动方接收ACK后进入
FIN_WAIT_2
状态
-
被动方在数据发送完毕后,向主动方发送一个带
FIN
标识位的数据包,表示被动方也要终止连接。 被动方进入
LAST_ACK
状态。
-
主动方收到
FIN
包后,向被动方发送一个
ACK
包,并进入
TIME_WAIT
状态。被动方接收
ACK
后终止连接,主动方一段时间后终止连接。
发送FIN 接收ACK 接收FIN并发送ACK
四次挥手 | | |
主动方: ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
被动方: ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED
| | |
接收FIN,回应ACK 数据发送完毕 接收ACK
评论