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

【精】TCP/IP的三次握手和四次挥手

2017-07-10 18:37 477 查看

一、什么是TCP传输控制协议?

TCP传输控制协议,是一个面向连接的协议。在运用此协议进行数据传输前都会进行连接的建立工作(三次握手);当数据传输完毕

连接的双方都会通知对方要释放此连接(四次挥手)

二、各字段端口代表的意义



(1)源端口和目的端口:端口号表明唯一的网络服务,IP地址和端口号共同标识网络中唯一的一个进程。通过查看/etc/services文件,可以看到所有的well-known的端口。比如HTTP是80端口等等。
(2)序号:在TCP连接中传送的每一个字节都是按照顺序进行编号。所以,这个字段的值就是本报文段所发送的第一个字节的序号。
(3)确认号:期望收到对方下一个报文段的第一个数据字节的序号,也就是说,该编号之前的所有字节都已经正确收到。
(4)首部长度:由于 TCP的首部长度并不是固定的,所以,我们必须有一个段来表示首部长度,以便用来区分首部和有效载荷部分。这里的首部长度和IP数据报中的首部长度的含义是一样的,首部长度的值*4得到首部长度的字节数。
(5)URG:URG==1时,告诉系统该报文中有紧急数据,应该尽快传送。
(6)ACK:当ACK==1确认字段才有效,ACK==0,确认号无效。TCP中规定,当连接建立之后,所有传送的报文段的ACK都必须是1.
(7)PSH:当PSH==1时,表明发送方发了一个紧急指令并希望接收方立即回复,所以,此时就要立即创建一个报文段,把所要发送的数据发送出去 ,不需要等待整个缓冲区都满了才向上交付。
(8)RST:RST==1表示TCP连接中出现严重的查错,必须释放连接,重新进行连接。
(9)SYN:当SYN==1表示这是一个连接请求或者连接接受报文。
(10)FIN:FIN==1表示数据已经发送完毕,请求断开连接。
(11)窗口:2字节,窗口值就是用来告诉对方,发送方可以接收的最多的字节数,希望对方不要一次性发太多,造成网络堵塞。所以,窗口字段的值,表示允许对方发送数据的最大字节数。

(12)16位检验和:检验首部和数据部分。需要加一定的伪首部。通过伪首部来确认收到的数据是否和发送方发的数据是一样的。 既不上传也不下传,仅仅是为了检验和。

(13)紧急指针:只有在URG==1时,该字段才有效。它指出紧急的数据的字节数(紧急数据之后就是普通数据),也就是指出了紧急数据在报文段中的位置(即使滑动窗口为0,也可以发送紧急数据)。
(14)选项:表明TCP的首部是可变长的。如果没有选项,TCP的首部长度是20字节。

三、三次握手过程



第一次握手:host去发送一个TCP标志位SYN=1、ACK=0的数据包给host2,并随机产生一个
Sequence number=3233.当host2 接受到这个数据后,host2由SYN=1可知客户端是想要建立连接的;
第二次握手:host2要对客户端的联机进行确认,向host1发送应答号ACK=1、SYN=1、确认好Acknowledge number=3234,
此值是host1 的序列号加1,还会产生一个随机的序列号Sequence number=36457;这样就告诉host1可以进行连接;
第三次握手:host1收到数据后检查Acknowledge number是否是322+1的值,以及ACK的值是否为1,若为1,host1会发送ACK=1、
确认号码为Acknowledge number=36457,告诉host2,你的请求连接被确认,拦截可以建立

四、四次挥手过程

第一次挥手:当传输的数据到达尾部时,host1向host2发送FIN=1的标志位;可理解成,host1向host2说,我这边的数据传输完成了,我准备断开连接;
第二次挥手:因TCP的连接是全双工的双向连接,关闭也是要从两边关闭;当host2收到host1发来的FIN=1的标志位后,host2不会立刻向host1发送FIND=1的
应答信息,表示:你请求关闭的请求我已经收到,但我可能还有数据没有传输完成,你在等会,等我数据传输完了我就告诉你
第三次挥手:host2数据传输完成后,向host1发送FIN=1,host1收到请求关闭连接的请求后,host1就明白host2的数据传输完成,现在可以断开连接了
第四次挥手:host1收到FIND=1后,host还是怕由于网络不稳定的原因,怕host2 不知道他要断开连接,于是向host2发送ACk=1确认信息进行确认,把自己设置成TIME_WAIT
状态并启动定时器。如果host2没有收到ACK,host端TCP的定时器到达后,会要求host1重新发送ACK后,当host2收到ACK后,host2就断开连接,当host1等待2MLS(2倍报文最大生存时间)后,没有收到host2的重传请求后,他就知道host2已收到了ACK,所以host1此时关闭自己的连接。
host1工作



host2工作



五、主动断开链接的一方为什么要进入TIME_WAIT状态

MSL是最长报文长度,在RFC793建议设为2分钟,2MSL就是四分钟。
1.为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端在重传一次确认,重新启动时间等计时器。最后客户端和服务器端都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK后直接释放环比,一旦这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。
2、他还可以防止已失效的报文段。客户端在发送最后一个ACK后,再进过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。
注意:在服务器发送了FIN-ACK之后,会立即超时重传计时器。客户端在发送最后一个ACK之后会立即启动时间等待计时器。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: