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

网络编程(二)TCP面向连接服务 三次握手和四次挥手

2017-11-04 21:09 337 查看
一、TCP面向连接服务

1、三次握手创建连接





TCP连接建立过程:首先由客户端给服务器发送一个SYN连接请求;接着服务器会连同SYN这个请求和它的回馈标识ACK一起发送给客户端,SYN/ACK有两个意义:一是确认收到上一个报文、二是告诉客户端同意连接请求;然后客户端仔给服务器发送一个ACK回馈,表示它确认了服务器端同意的请求。

2、SYN:连接请求                         ACK;回馈标识

3、服务器给客户端发送SYN/ACK的原因:因为网络环境比较复杂,SYN在传输过程中有可能会丢失,所以在回复客户端时需要将它收到的请求继续发过去,确认自己收到的请求是正确的。针对网络环境中数据丢失的问题,TCP实现超时重传机制,在一定时间内如果没有收到回复,则会重新发送数据。

4、客户端给服务器发送ACK的原因也就是为什么是三次,都已经确认同意请求了为什么还要回复?

在TCP连接创建连接的过程中还要考虑可靠性的问题,所以反过来,客户端也要给服务器回馈它已经知道服务器同意连接请求了。

TCP要保证两端建立起一条通讯线路时才会服务。

5、在创立连接的过程中,不会是两次,最少三次,如果三次没完成,说明建立失败,通讯失败。如果两端都发送请求,则至少会是四次,两端都有一次发送和接收。

6、在TCP程序流程中连接是什么时候建立什么时候断开呢?

如果是客户端发送连接请求,connect是连接请求函数,这个函数的返回值是成功返回0,失败返回-1。当它有了返回值时说明建立连接有了结果,也就是说三次握手是在客户端在connect函数调用过程中完成的。在服务器端呢,因为它是监听函数listen和获取函数accept,它不会发送连接请求。listen函数真正建立两个队列,一个是已经完成三次握手的;一个是正在进行三次握手的,而accept函数并不管连接建立过程的事,它只是去获取已经完成三次握手的一次连接,当然获取的过程也有可能会出错,确切来说服务器端完成三次握手真正是由内核来做监听的。

断开连接则很简单,在任何一方调用了close函数后连接就会关闭。

7、四次挥手断开连接





(1)首先由客户端发送断开请求(服务器先发送也可以,只要连接建立起来谁县断开都可以)。

(2)服务器回馈ACK,确认FIN请求。如果此时服务器工作黑没有做完则会由一阶段的数据处理时间。

(3)服务器数据处理完了后给客户端发送FIN断开连接请求,客户端也回复给服务器ACK,确认断开请求,此时连接关闭。

8、断开连接有可能也是三次,因为如果请求发送过去后,服务器刚好没有工作了,此时没有数据处理间隔时间,服务器会将FIN/ACK 一起发送给客户端,然后关闭连接。

9、三次握手四次挥手状态





三次握手:(1)如图如果是客户端发送连接请求SYN,它的状态为SYN_SENT(已经发送);

                 (2)服务器接收到请求后,发送SYN/ACK,状态为SYN_RCVD;

                 (3)客户端发送ACK后状态变为ESTABLISHED:三次握手完成状态,服务器收到ACK后也变为ESTABLISHED状态。

                    接下来就可以进行数据收发。

四次挥手:(1)客户端发起断开请求FIN,状态为FIN_WAIT1;

                 (2)服务器收到断开请求后发送ACK,(此时有数据处理间隔时间),客户端变为FIN_WAIT2状态,服务器为CLOSE_WAIT等待关闭状态;

                 (3)当服务器结束工作后发送FIN/ACK,客户端变为TIME_WAIT状态,服务器变为LAST_ACK状态;

                 (4)客户端发送ACK后,服务器变为CLOSED关闭状态,但是客户端没有CLOSED,说明客户端没有关闭。

 注意:TIME_WAIT出现在主动发送断开请求的一方;它的状态意义是能保证TCP连接可靠的关闭;也可以保证迟到的数据报能被识别并丢弃。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: