什么是TCP协议?
传输控制协议(英语:Transmission Control Protocol,缩写:TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。用户数据报协议(UDP)是同一层内另一个重要的传输协议。
——来源与WIKI百科
既然TCP
提供的是一个可靠的传输协议,那么如何才能保证,你的传输通道真正的可靠呢?
如果在传输过程当中丢失了数据,或者说,数据发生了变化
(比如说本来应该在第一个字节的数据,因为网络延迟,在最后一个字节接收)
如何才能确保不会发生这类的问题呢?
所以TCP
采用了三次握手的方式,来保证服务端与客户端之间建立的连接,是可靠的,既可以正确的发送,又可以正确的接收。
我们先通过下面这张图片(图1)来简单的阅览一下TCP
的三次握手是什么意思。
从图1可以看到,三条箭头代表着三次握手,那么图1当中的英文单词分别是什么意思呢?SYN
- synchronization
同步
—— 表示传输的数据内没有有用的数据,是用来建立连接的数据
seq
- Sequence
序列
ACK
- Acknowledgement
答复
—— 这是一个确认报文,代表你确认接受了上次传输的数据
为了更好的理解,我定义了两个字母:C
- Client客户端
| S
Server
服务端
C
->S
Client to Server
客户端发送到服务端
S
-> C
Server to Client
服务端发送到客户端
第一次握手:
C
->S
客户端主动打开链接,发送一个SYN=1
,服务器端则会被动打开连接,切换到LISTEN
状态,也就是监听一个端口。
客户端在发送SYN
的同时,还会带上一个seq
数字X
,这个数字是一个系统自动生成的随机数,用来标注传输数据的序号,作为第一次握手的数据的编号。防止数据因为网络延迟而造成顺序的差错。第二次握手:
S
-> C
服务端接收到客户端发送的数据后,同样也会回复一个SYN=1
,同时也会回复一个确认报文ACK=1
,表示我已经接收了上一次你发来的数据。为了证明他真的接收到了,所以它需要发送一个叫做ack
的数字,是第一次握手的时候客户端发送来的seq
也就是X
进行+1
操作X+1
,同时也为他的数据进行了编号,seq+1
就是他这个数据的编号。
现在只是确认了客户端上一次发送过来的数据我服务端正确的接收了,接下来就是要证明你这个客户端是不是也能正确的接收到我服务端的信息。和客户端第一次握手一样,服务端也会生成一个seq=Y
数字,也是根据系统随机生成的,作为第二次握手的数据的编号,随同以上SYN
ACK
ack
这些数据,一同发出给客户端。第三次握手:
C
-> S
客户端接收到了服务端发送过来的数据之后,和第二次握手一样,也需要给服务端发送给一个“嗯,我正确接收到了”的数据,也就是ACK=1
确认报文,同时也回复了ack=Y+1
来证明我的数据是按照你的发送过来的序号的顺序来接收的。最后在发送一个seq=X+1
作为第三次握手的数据的编号。
这样,他们的连接就正确可靠的建立了。
如果在发送途中的某一次握手断了怎么办?
等我不咕咕咕了再慢慢写吧。