首先,最基本的三次操作方的说明如下:
- 客户端向服务端发送请求;客户端 → 服务端
- 服务端确认客户端发送到来的请求;服务端 → 客户端
- 客户端确认服务端发送到来的确认。客户端 → 服务端
最显浅的目的解释如下:
- 第一次握手:“你”是不是在监听指定端口?
- 第二次握手:“我”的确在监听某个端口,“你”可以跟我建立连接。
- 第三次握手:“我”收到了“你”的回复了,“你”做好准备吧。
要是认真思考过后,还不能理解上面的说法的话,你可能需要知道这些TCP协议实现的基本背景
- TCP是建立在IP协议之上的,而IP协议作为网络层协议,并不保证每个发送的消息,都能到达目的IP;
- 网络层协议不仅不保证每个数据能不能到达目标地址,而且并不保证你发送的顺序,会更目标收到的顺序相同;
- 服务端只是一个提供服务的个体,它跟客户端的关系是一对多。
- TCP是全双工的,a能到达b未必就是b能到达a。
为什么
TCP需要这样设计呢?
- 第一次握手的时候,TCP协议头中会携带它发送的
序列号a
(以及窗口大小等,不过这是题外话),以确保服务端没有回复的时候,它发出第二次(或者内容不一样)请求的时候,能够区别开; - 第二次握手,服务端确认的同时,会携带上客户端发过来的
序列号
(准确来说,这个时候已经叫确认号
了,值为a+1),以及自己的发送序列号b
;(“我”只确认a这个序列号的请求,其他序号的有可能丢失,有可能其他原因没有收到的,“我”不管) - 第三次,客户端会携带上服务端发过来的
序列号
(此时也应称为确认号
,值为b+1),并且因为服务端刚才确认收到的是a数据,所以这次自己携带的序列号
为a+1。