上图是TCP的三次握手,从图中我们可以看到:
第一次:客户端向服务器发送链接请求SYN_SENT,发送的内容的主要包含SYN(synchronize)同步请求和SEQ(sequence number)序列号X.(注意:这里的X是随机生成的)
第二次:服务器向客户端回复的确认收到应答SYN_RECV,主要内容包括可以同步的和确认应答的SYN+ACK,服务器随机产生的序列号Y,确认应答ACK的值为第一次客户端给服务器请求连接的确认值X在加1,意在告诉客户端我下次期望收到你发送的序列号的值是X+1。rwnd(就是我们在上一章中讲到的窗口)窗口为5000,也即我服务器告诉客户端我一次最大能接受5000个字节的数据。通过第二次握手就可以告诉客户端A我已经收到你的连接请求了,并且你可以和我之间可以建立连接。
第三次:客户端向服务器发送建立连接确认,同样的这次客户端向服务器发送了序列号(序列号的值为第二次握手时,服务器告诉客户端“我下次期望收到你发送的序列号为X+1” ),确认值为第二次握手时服务器向客户端发送的序列号的值Y加1,同样的客户端也告诉服务器,我一次最大能接受大字节是1000,你可不要发的超过了我这个最大值。
TCP通过这三次握手就能建立起一个安全,可靠的连接了。
下面我们通过抓包软甲wireshark来做一个抓包的实验,验证一下上述机制。试验中我们打开了www.hao123.com的网址,然后通过抓包软件我们得到了如下的结果
从上图我们能看到,抓取的结果。值得注意的是在34那行的服务器端口从80变成了443.这是为什么呢?是因为在我们访问服务器的时候http协议变成了https,即服务器给该端口加密了,所以给出的不是真正的端口
我们简单的介绍一下上诉结果,每一列的表示的含义。
29,34,36,37这些代表序号;
2.571389代表时间;
10.10.10.101表示客户端,即我们的电脑的IP地址;
61.135.162.10表示的是目标服务器的IP地址,即hao123网址解析的服务器的IP;
TCP:表示的是协议;
66:表示的是字节长度;
52137:表示的是客户端的所用的动态端口;
80:表示的是目标服务器所用的端口;
后面的一些内容就是TCP首部的详细信息了,我们看下面的图
下图为编号34的详细内容:
这里我们从图中主要看我们在三次握手中所讲的几个值的变化,具体不再详细解释
下图为编号为36的详细内容
下图为37的详细内容
注意:在此图中有三个值需要解释一下,即:
Window Size Value : 258 窗口值大小
Window size scaling value: 256 窗口系数值
Caculated Window size :66048 计算窗口大小。 这个值是上述两个值的乘积(258X256)得来的.
下面我们在来看一下四次释放连接
由上面的三次握手协议的解释,就能知道四次释放协议的每一次所发送值的含义了,这里不再赘述。