赞
踩
TCP/IP协议
互联网协议(Internet Protocol Suite)是一个网络通信模型,以及一整个网络传输协议家族,为互联网的基础通信架构。它常被通称为TCP/IP协议族(英语:TCP/IP Protocol Suite,或TCP/IP Protocols),简称TCP/IP。
概念:指在发送数据的准备阶段,需要先建立连接,(三次握手来建立连接)
想一个日常场景:
你和朋友打电话的时候,信号不好,你们正式通过之前要确认对方能听到自己说话。
场景肯定是这样的:
你:你能听到我说话吗?
你朋友:我能听到你说话,你能听到我说话吗?
你:我能听到你说话
这就三次握手建立了连接,双方确认了都能听到对方的说话,然后接下来开始交谈正式内容了。
自己的理解:
三次握手,就是在建立连接。如何定义建立连接?
一、就是A给B发送消息1 (A只知道自己刚刚发送了消息,但是发没发送成功,B有没有收到?A是不知道的,万一网络不好消息丢了呢或者B的协议不对,不能收到A的消息呢)
二、B给A发送消息2,告诉A,B刚刚收到了消息1,(此时,A给B发送消息,确认B是可以收到的A的消息,但是A有没有收到B的消息2,我们是不知道的,我们只是发出了消息,不确定收到消息没,万一消息2发丢了呢)
三、所以第三次,就是A再给B发送消息,告诉B,A可以收到B的消息。
三次握手完成,双方确认了都可以收到对方消息,这就建立连接成功了
同步序号:SYN 确认字段:ACK 随机数据:seq
规定:
当SYN=1,ACK=0表示连接请求
当SYN=1,ACK=1表示同意建立连接
如上图,纵向的轴,是一个时间轴。
第一次握手:时间点1,客户端向服务端发送连接请求报文段。ACK=0,SYN=1,seq=x
将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
完成了三次握手,客户端和服务器端就可以开始传送数据。
为什么是三次握手?而不是两次握手
原因1: 两次握手只能保证单向连接是畅通的。因为TCP是一个双向传输协议,只有经过第三次握手,才能确保双向都可以接收到对方的发送的数据。
接着上面的那个打电话的日常场景,如果是2次握手话,场景就是这样的。
你:你能听到我说话吗?
你朋友:我能听到你说话,你能听到我说话吗?
你:我能听到你说话
只是确认了对方能听到你说话,但是不能确认你能听到你朋友的说话。
如果两次握手,就正式谈话,如果你听不到你朋友的声音,这些你朋友给你说的话不就丢失了么。
无法保证服务器与客户端的连接是建立成功的。
三次握手过程:
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
原因2:主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而导致不必要的错误和资源的浪费。
如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送的第一个请求连接并且没有丢失,只是因为在网络中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时之前滞留的那一次请求连接,因为网络通畅了, 到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。