tcp连接的时候的3次握手和释放的4次挥手

来源:互联网 发布:男生休闲鞋推荐 知乎 编辑:程序博客网 时间:2024/04/29 15:53

关于tcp-ip

1、请简述头tcp-ip的3次握手以及4次挥手过程,并解释为何关闭连接需要4次挥手?

握手方面:
1)建立连接时,客户端向服务器发送一个syn(syn=j)(SYN:同步序列编号Synchronize Sequence Numbers)(随机产生seq number=1234567的数据
)包到服务器,并进入SYN_SENT状态(即为:请求连接的状态),等待服务器的确认。(也就是要求客户端和服务器进行相应连接的请求。)


第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包(即为:应该客户端发送过来的请求包),此时服务器进入SYN_RECV(即为:SYN_RECEIVED)状态;(即:已经接收了客户端发过来的请求,同时返回了一个确认连接的信息。)


第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
(服务器在等待接收客户端发送过来的请求的时候以及接收之后的变化情况:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于 Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。)


三次握手完成两个重要的功能:
1)双方做好发送数据的准备工作(双方都知道彼此已经准备好)
2)允许双方就初始化系列进行协商,这个序列号在握手过程中被发送或者确认。


TCP-IP为什么不会采用两次握手,会如何?(采用四次就会有点多余了)
1)假设A给B发送一个连接请求分组,B收到了这个分组,并发送确认应答分组。
2)按照两次握手的协定,B确认连接已经成功第建立了,可以开始发送数据分组。
出现的结果:
1)A在B的应答分组在传输中被丢失的情况下,将不知道B是否准备好,不知道B建议的是什么序号。(序号具有发送和确认的作用,应该序号起到功能的引导作用。)
2)A甚至怀疑B是否收到自己的链接分组。(因为A没有收到B的应答,所以A不知道B是否收到A发送的SYN,所以(有可能再次发送)不一定再次发送)
3)在这种情况下,A认为链接还没有建立成功,将忽略B发来的任何数据分组,值等待确认应答分组。
4)而B在发出数据分组超时后,重复发送同样的分组,这样就形成了死锁。


释放方面:(4次挥手)
4次断开(释放可以由任何一方发起)
1 当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求
2 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1
3 由B 端再提出反方向的关闭请求,将FIN置1
4 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束.


由TCP的三次握手和四次断开可以看出,TCP使用面向连接的通信方式,大大提高了数据通信的可靠性,使发送数据端
和接收端在数据正式传输前就有了交互,为数据正式传输打下了可靠的基础


名词解释:
ACK TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号之前的数据段
都收到了.比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性.
SYN 同步序列号,TCP建立连接时将这个位置1
FIN 发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1


解释四次挥手的原因:
解释1)TCP建立连接要进行3次握手,而断开连接要进行4次,这是由于TCP的半关闭造成的,因为TCP连接是全双工的(
即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭.关闭的方法是一方完成它的数据传输后,就发送一个FIN来向另一方通告将要终止这个方向的连接.当一端收到一个FIN,它必须通知应用层TCP连接已终止了这个方向的数据传送,FIN通常是应用层进行关闭的结果.
解释2)服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。


参考链接:
http://www.cnblogs.com/CBDoctor/archive/2012/10/17/2727073.html
http://blog.csdn.net/qq276592716/article/details/19762121


0 0