TCP/IP 概念层模型
对比的是 OSI 七层模型
- 应用层(http)
- 传输层(tcp)
- 网络层(ip)
- 链路层(以太网)
数据包
网络中传输的数据包由两部分组成,一个是协议所要用到的首部,另一部分是上一层传过来的数据。
- 首部,明确标明了协议应该如何读取数据,就像协议的脸。
传输层协议
具有代表性的两个,分别是 tcp 和 udp
TCP
- 面向连接的,可靠的协议。
- 为提供可靠性传输,提供顺序控制和重发控制。
UDP
- 不具有可靠性的数据报协议
- 实时性要求高
端口号
一台计算机上可以同时运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序。
- 数据链路层,指的是 mac 地址,用于识别统一链路中不同的计算机。
- 网络层,指的是 ip 地址,用于识别 tcp/ip 网络中互联的主机和路由器
- 传输层,指的是端口号,用于识别同一计算机中进行通信的不同应用程序。被称为程序地址。
端口号的确定
标准既定的端口号
- 每个应用程序都有其指定的端口号,但不是说随意使用任何一个端口号。例如 http,ftp 所使用的端口号就是固定的,这些叫知名端口号。
- 知名端口号分布在 0-1023
- 此外还有一些端口号被正式注册,他们分布在 1024-49151 之间,可用于任何通信用途
时序分配法
- 服务器有必要确定监听端口号,但是接受服务的客户端没必要确定端口号
- 客户端应用程序全权交由操作系统设置
TCP 的三次握手
建立连接
- 第一次握手:客户端将标志位 SYN 置为 1,随机产生一个值 seq=J,并将该数据包发送给服务器端,客户端进入 SYN_SENT 状态,等待服务器端确认。
- 第二次握手:服务器端收到数据包后由标志位 SYN=1 知道客户端请求建立连接,服务器端将标志位 SYN 和 ACK 都置为 1,ack=J+1,随机产生一个值 seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入 SYN_RCVD 状态。
- 第三次握手:客户端收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务器端,服务器端检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入 ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
TCP 的四次挥手
中断连接端可以是客户端,也可以是服务器端。
- 第一次挥手:客户端发送一个 FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入 FIN_WAIT_1 状态。意思是说”我客户端没有数据要发给你了”,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
- 第二次挥手:服务器端收到 FIN 后,先发送 ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入 FIN_WAIT_2 状态,继续等待服务器端的 FIN 报文。
- 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送 FIN=N 报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入 LAST_ACK 状态。
- 第四次挥手:客户端收到 FIN=N 报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送 ack=N+1 后进入 TIME_WAIT 状态,如果 Server 端没有收到 ACK 则可以重传。服务器端收到 ACK 后,就知道可以断开连接了。客户端等待了 2MSL 后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。