您的位置:首页 > 理论基础 > 计算机网络

TCP 连接建立之 三次握手

2013-09-30 16:06 155 查看
网上看了好多关于TCP 三次握手的文章,云里雾里的都没没说清楚,或是跟自己 wireshare 抓的包显示的情况不一致。

最终还是拜读了<< TCP IP Illustrated, Vol 1 The Protocols 2nd >> 得以明白,在此总结一下。

TCP 连接是包含两对 IP 地址 和两对 端口号的四元组。更精确的说,TCP 连接是一对 endpoints 或是 sockets, 每一端都由IP 地址和端口号标示。

一个典型的TCP 连接包括如下三个阶段:

建立(setup)
数据传输(data transfer: established)
断开(teardown: closing)

这几个状态的切换处理的是否正确是 TCP 实现的一大难点。

下面是一个典型的 TCP 连接建立和断开的过程(不包括任何数据传输)



通常,client 端发起一个 三次握手,用于client 端和server 端 交换 Initial Sequence Number,ISN(c) 和 ISN(s)。

Active opener, 也就是 Client 客户端首先发送一个 SYN segment 报文段(其实就是一个将TCP 首部中SYN位置位的TCP/IP 报文),这个报文段主要用于声明客户端想要连接的对端的端口号,以及Client 客户端的初始序列号 ISN(c);
Passive opener, 也就是Server 服务器端接下里发送一个 SYN+ACK 报文段,其中包括了 Server 端的ISN(s)。Server 端同时通过把确认序号置为客户端的 ISN(c) + 1来响应客户端的SYN 报文段。
客户端接着发送一个 ACK报文响应 Server 端的 SYN报文段,这个ACK报文中确认序号被置为 ISN(s) + 1。SEQ 序号为ISN(c) + 1。
总结一下就是客户端首先发起一个同步(SYN)请求,同步什么? 客户端的初始序号;接下来,服务器端收到了客户端的同步报文,知道了客户端的初始序号,很自然,服务器需要告诉客户端自己已经知道客户端的初始序号,同时,服务器也要告知客户端自己的初始序号,因此,这个报文做了两个事情(SYN+ACK)既是同步请求也是响应,为了让客户端知道服务器响应的是哪一个报文需要将 确认序号置为客户端的SYN报文中客户端初始序列号+1;最后,客户端在知晓了服务器端的初始序列号之后发送确认(ACK)报文,自然确认序号需要将服务器端初始序号
+1,客户端自己的序号当然是接着+1。

这样,就完成了著名的 TCP 连接的建立: 三次握手。

wireshark 抓包:

三次握手:



第一次握手:



第二次握手:



第三次握手:



参考文章:

http://www.cr173.com/html/20128_4.html

http://blog.csdn.net/kuangreng/article/details/6479413

http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: