TCP/IP协议是一个分层联网协议。它包含IP和位于其上的其他协议层。

TCP/IP协议具有一个重要原则——封装。其关键概念为:低层不会对高层传来的信息进行解释。

当信息从高层传向低层,会加一层本层的头信息。而信息从低层传向高层时,会有一个解包的过程。

一个应用A向应用B传输信息的大致过程

1
2
3
4
5
6
7
8
             封装为 包      封装为 帧               检查 IP 头部 若匹配,剥离 IP 头部,将段交给传输层。
添加 IP 头部 添加 帧头和帧尾 若不匹配且本机为路由器,则重新路由转发
| | |
应用A->传输层->网络层->数据链路层->网络介质->数据链路层->网络层->传输层->应用B(接收数据)
| | | |
添加 传输层头部 比特流 剥离帧头和帧尾 检查端口号,确定目标应用
封装为 段 或 数据报。 校验帧完整性 剥离传输层头部,将原始数据交给应用层。
高层 低层 低层 高层

IP是一种无连接不可靠的协议。它不保证包到达的顺序和发送的顺序一致。也不保证不会重复发送和到达接收者。网络的可靠性由如TCP一样的可靠传输层协议维护。

TCP是一种面向连接的、可靠的传输协议。 它需要先建立连接,后传输数据。

TCP通过三次握手建立连接,通过四次挥手终止连接

三次握手

  1. 客户端向服务器发送一个带有标志位SYN的数据包,表明自己希望与服务器建立连接。 客户端的TCP状态变为SYN_SENT
  2. 服务器回复一个带有标志位SYNACK的数据包,表示同意建立连接。 服务器的TCP状态变为 SYN_RECEIVED
  3. 客户端接收到服务器的SYN-ACK包后,回应一个ACK包,表示连接建立。 服务器和客户端的TCP状态都变为ESTABLISHED,连接建立。
1
2
3
三次握手
服务器: LISTEN -> SYN_RCVD -> ESTABLISHED
客户端: CLOSED -> SYN_SENT -> ESTABLISHED

四次挥手

  1. 主动方向被动方发送一个带标志位FIN的数据包,表示自己想要终止连接。 主动方进入FIN_WAIT_1状态。
  2. 被动方收到FIN包,回应一个ACK包,表示确认收到关闭请求。 被动关闭方进入CLOSE_WAIT状态。 主动方接收ACK后进入FIN_WAIT_2状态
  3. 被动方在数据发送完毕后,向主动方发送一个带FIN标识位的数据包,表示被动方也要终止连接。 被动方进入LAST_ACK状态。
  4. 主动方收到FIN包后,向被动方发送一个ACK包,并进入TIME_WAIT状态。被动方接收ACK后终止连接,主动方一段时间后终止连接。
1
2
3
4
5
6
                        发送FIN          接收ACK        接收FIN并发送ACK
四次挥手 | | |
主动方: ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
被动方: ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED
| | |
接收FIN,回应ACK 数据发送完毕 接收ACK