简单介绍了SOCKET的原理模型——TCP/IP模型,包括了三次握手/四次握手。

1. 网络模型

TCP/IP模型,又称传输控制协议/网际协议(Transmission Control Protocol/Internet Protocol)

简单来说,此协议的通信过程如同数据出栈入栈的过程。

  • 入栈:数据发送方每层不断地封装头部和尾部,向中间添加传输信息
  • 出栈:数据接收方每层不断拆除头部尾部,读取中间的传输信息

TCP/IP协议借鉴了OSI参考模型(Open System Interconnect),主要针对计算机网络体系。

  • 应用层:具有HTTP和FTP等协议
  • 传输层:具有TCP和UDP(User Datagram Protocol)用户数据报协议
  • 网络层:包含了IP协议
  • 数据链路层:也称网络接口层,为等待传送的数据加入一个以太网协议头,为传输做好准备

如果用发快递作比喻

  • 应用层:帮客户打包
  • 传输层:从快递点送到集散中心
  • 网络层:集散中心确定将要发送的地址
  • 数据链路层:将小包裹打包成集装箱(装帧),由此控制发送流量等信息
  • 物理层:高速路、铁路送走

2. Socket原理

2.1 概念

socket是应用层传输层之间的抽象层,他是一组接口,将复杂的传输层和网络层协议隐藏到socket接口后面

socket是从Unix/Linux引入的概念,而Unix/Linux的哲学就是:一切皆文件,都可以用”open—>write/read—>close”模式进行操作。同样的,socket的思路也是打开、读写IO、关闭。

2.2 三次握手

所谓三次握手是指建立一个TCP连接时,需要客户端和服务器发送3个包

名词解释:

  • SYN:Synchronize,同步标志位,为1时表示序列号有效
  • ACK:Acknowledgment,确认标志位
  • seq:Synchronize Sequence Number,同步序列号
  • ack:确认序列号

握手过程:

  1. 第一次握手:客户端发送SYN标志为1的包,以及同步序列号x,并指明打算连接的服务器端口。此时,connect进入阻塞状态。
  2. 第二次握手:服务器收到后,发送SYN和ACK标志为1的包,同时也发送一个自己的同步序列号y,外加一个确认序列号ack=x+1。此时accept进入阻塞状态。
  3. 第三次握手:客户端收到后,再次发送ACK=1,以及同步序列号seq和确认序列号ack,与此同时,connect返回。当服务器收到ACK=1时,accept返回。

2.3 四次挥手

中断连接时需要发送4个包,此时客户端和服务器均可主动发起挥手操作,只需要调用close()函数即可。

B收到FIN结束消息时,干两件事:发送确认标志和通知其他进程准备关闭(这也是为什么要多一次挥手)。当准备完毕时,发送FIN。

A收到FIN时,也干两件事:发送确认标志和等待2MSL(Maximum Segment Lifetime)

2.4 常见问题

为什么不能用两次握手连接

三次握手完成两个重要功能:

  • 双方都知道彼此已经准备好
  • 确认彼此的序列号

假设只有两次握手,A向B发送连接请求,B收到后回复消息,B认为此时已经连接成功,开始发送数据。然而,如果B的回复消息丢失了,A没有收到确认消息,只有再次发送连接请求,而此时B有在向A发送数据,这样就会造成死锁

为什么连接是三次握手,而关闭时是四次?

关闭连接时,服务端需要回复两次

  • 第一次告诉客户端,我已经收到了你的请求了,但我的剩余报文还没有处理完,等一等。客户端收到后不再发送请求,开始默默等待。
  • 第二次告诉客户端处理完成。

为什么TIME_WAIT状态需要经过2MSL?

2MSL是一次发送和回复的最大时间,客户端最后一次发送ACK可能会丢失,如果此时冒然关闭,会导致服务器没收到ACK,然后一直发一直发。所以需要等2MSL,如果超过这个时间,都还没有收到服务器的信息,说明已经完成,可以关闭。