打开云南省住房和城乡建设厅网站,找单位做网站需要注意什么,杭州专业seo,制作网站软件叫什么在上一节中#xff0c;TCP首部常用的几个选项#xff0c;有些选项的参数就是在通信双方在建立TCP连接的时候进行确定和协商的。所以在学习过TCP报文首部之后#xff0c;下面我们开始学习TCP的连接建立。
TCP的一个特点是提供可靠的传输机制#xff0c;还有一个特点就是TCP…在上一节中TCP首部常用的几个选项有些选项的参数就是在通信双方在建立TCP连接的时候进行确定和协商的。所以在学习过TCP报文首部之后下面我们开始学习TCP的连接建立。
TCP的一个特点是提供可靠的传输机制还有一个特点就是TCP是面向连接的。面向连接意思就是说在进行数据的传输之前先要建立连接再传输数据传输完毕之后再释放连接。在这个过程中要保证可靠传输的话建立连接需要通信双方进行“三次握手”数据传输中由一些TCP的可靠机制来保证释放连接需要通信双方进行“四次挥手”。我们按顺序学习这一节先学习建立连接的“三次握手”过程。
“三次握手”这是一个比较传统的名称也是业内用的最广泛的说法。但这个说法并不太准确谢希仁教授的最新一版的教材中指出更准确的说法应该是“三报文握手”因为通信双方建立TCP连接时相互交换了三个报文而不是三次。不过为了贴合业内已被广泛使用的说法所以本文还是使用“三次握手”这个称呼。 “三次握手”的过程
为了更清楚的说明这个过程所以我们在这里学习的时候最好带入一个情景最典型的就是“C/S情景”也就是“客户—服务器”情景。客户是请求服务的服务器是提供服务的带入这个情景可以更好的理解整个交互过程而且TCP建立连接使用的就是“客户—服务器”的方式。
不过要注意的是“客户—服务器”这里指的是一种比较抽象的概念我们前面讲两台主机之间的通信实际上就是两个应用进程之间的通信。所以我们就这样想请求服务的一方它的进程需要主动发起连接而提供服务的一方它的进程要等待连接建立。主动发起连接的就是客户进程等待连接建立的就是服务器进程。
带入这个情景之后“三次握手”的过程理解起来也就比较容易了
使用教材上比较经典的例子来说明 在上面这个图中客户方是主机A的一个进程服务器方是主机B的一个进程。为了方便叙述以下简述为客户A、服务器B
图中的“CLOSED”、“LISTEN”、“SYN-SENT”等等这些代表的是TCP的连接状态表明当前这个TCP连接处在哪个步骤。
第一次握手
一开始客户A和服务器B都是处于“CLOSED”状态也就是关闭状态。客户A主动发起TCP建立连接请求也就是向服务器B发送一个报文段在这个报文段中“SYN”控制位设置为1表明“同步位有效”并选择一个随机数 x 作为序号发送完毕之后客户A进入“SYN-SENT”同步已发送状态。同时服务器B由于是等待连接建立所以是进入“LISTEN”监听状态等待来自客户端的连接建立请求。
第二次握手
接收到客户端的连接建立请求后服务器B进入“SYN-RCVD”同步已收到状态并向客户A发回一个确认报文。在这个确认报文中同样要把“SYN”位设置为有效同时选择一个新的随机数 y 作为确认报文的序号。另外由于这是确认报文所以必须把“ACK”位也设置为有效并选择“x1”作为确认号。
在这里我们就可以注意到一个问题了。为什么确认号是“x1”呢
我们前面讲过确认号的意思是期望收到对方的下一个报文的序号。客户A发送建立请求的时候序号设置为了 x 服务器B发回确认的时候把确认号设置为了x1这就说明服务器B期望收到客户A下一次发来序号为“x1”的报文段。
这就透露给我们一个细节第一次握手的时候客户A发出去的报文段是不携带数据的也就是这个报文段的数据部分是0字节。
第三次握手
客户A收到对方的确认报文之后还要向对方发送一个“确认的确认”。在这个“确认的确认”报文中SYN位不需要有效了因为双方已经完成同步了ACK位必须有效因为还要使用确认号。值得注意的是seq值也就是序号需要设置为“x1”因为对方期望我发送的下一个报文段的序号是“x1”你期望这个我就发给你这个同理这个ack值也就是确认号要设置为“y1”因为刚才对方发来的序号是y所以我期望你下一次发来序号为“y1”的报文段。
由此可见第二次握手和第一次握手一样都是不携带数据的。
第三次握手的报文发出去之后客户A进入“ESTABLISHED”连接已建立状态服务器B收到后同样进入连接已建立状态TCP连接建立成功。
不过从图中我们可以看到第三次握手的报文在发送过程中可以进行数据传送。这个是可以的第三次握手的报文是可以携带数据的。
现在又有一个问题为什么必须是三次握手呢看下面的情况
假设A发送连接建立请求但是很不巧当时这个报文“走”的网络路径比较拥堵导致这个报文在路上某一个路由器上长时间滞留。所以A在超时定时器到期之时重传了这个请求这次与服务器B成功建立了TCP连接传输数据完毕后释放了连接。这时第一次发出去的建立请求报文又恰好到达了B这时B就会认为这是一个新的连接所以B发送出确认A收到确认后发现这是一个对已经失效的请求报文的确认所以A不会理睬这个确认更不会给B发出“确认的确认”这个连接也就建立不起来不会白白浪费资源。 最后需要说明的是我们在这里只学习了TCP建立连接“三次握手”的最基本也是最必须的设置。当前具体情况中也会有一些其它的设置比如双方在建立连接时选择是否“窗口缩放”选项、将MSS值设置为多少等选项。 本节我们学习了TCP建立连接的“握手”过程从下面一节开始将学习数据传输过程中TCP是怎么保证可靠的包括TCP的流量控制、拥塞控制、基于滑动窗口的可靠传输等知识。
参考教材谢希仁《计算机网络》第八版