客户端与服务端的通信与TCP连接
1. 客户端与服务端的通信过程
当客户端想要跟服务端进行信息交互时,过程如下:
2. TCP连接
准备面试的时候背过好多次下面这个图,描述了TCP连接建立三次握手的过程:
图片来自互联网
当时只知道大致就是:
客户端发送一个同步报文请求建立连接,服务端响应一个同步-应答报文表示可以建立连接,然后客户端再发送一个应答报文表示了解了。至此三次握手完成,TCP连接建立,客户端开始发送数据。
上面的回答没有错,但感觉很粗略,现在通过分解知识点的方法来详细学习一下这个过程。
2.1 首先来看一下TCP报文中包含哪些东西:
图片来自互联网结合三次握手那张图来看我认为自己目前需要了解的是:
-
序列号 :就是握手过程中的那个seq。
我们知到TCP之所以是可靠的因为他保证了传送数据包的顺序。这个顺序就是通过序列号来实现的。直接看一看定义:
序列号占4个字节,范围为[0,4284967296]。由于TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,首部中的序列号字段则是指本报文段所发送的数据的第一个字节的序号。另外,序列号是循环使用的,当序列号增加到最大值时,下一个序列号就又回到了0。
看这段定义时我有点疑惑,他说“首部中的序号字段则是指本报文段所发送的数据的第一个字节的序号”,但是在三次握手建立连接的过程中,TCP报文中应该没有带着数据的,那为什么还会有序列号呢?
学习的时候看到了一个解释:
TCP规定,SYN=1的报文段不能携带数据(也就是说三次握手的前两次是不可以携带数据的),但要消耗掉一个序号。
该序列号为初始序列号,由发起会话的主机随机产生,可能是0和4,294,967,295之间的任意值。
当服务端主机接收到请求时,会响应一个TCP报文,该报文中的序列号则是由服务端随机产生,不过该报文中还会包含一个确认号(ack),值为客户端的初始序列号+1。关于确认号在下面介绍。
- 确认号:ack, 注意是小写啊
当ACK标志位为1时有效,表示期望收到的下一个报文段的第一个数据字节的序号。确认号为N,则表明到序列号N-1为止的所有数据字节都已经被正确地接收到了。
我自己的理解是,带有“ACK=1”字段的报文是主机表示了解,也就是跟对方确认自己收到了信息的意思。所以确认号就是用来表示:
“你前一次传过来的数据(n)我都收到了,可以发后面的数据(n+1)了”
所以用对方(前一次)的序列号+1来表示我准备好接收后面的数据了。
- SYN:同步序号
用来发起一个连接。当SYN=1而ACK=0时,表明这是一个连接请求报文段,若对方同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。
注意不光是发起连接会带有SYN字段,对请求的响应(同意建立连接)也会带上SYN
在带有SYN字段的TCP报文中,不能携带数据。
- ACK:确认序号
仅当ACK=1时确认号(ack)字段才有效,当ACK=0时,确认号无效。TCP规定,在连接建立后所有的传送报文段都必须把ACK置1。
就是表示好的,可以,我知道了。。。
- FIN:看字母也知道是finish的意思吧
用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放连接。
这个字段在解除连接(四次挥手)的时候会用到。
今天就先学到这里,明天结合上面的知识点解释一下三次握手和四次挥手的过程~
网友评论