网络编程——TCP通讯时序

TCP三次握手

客户进程发出连接请求报文段,此时首部同步为SYN=1,同时选择一个初始序号seq=x,TCP规定,SYN=1时报文段不能携带数据,但要小号一个序号,此时客户进程进入SYN_SENT(同步发送)状态;

服务进程接收到客户进程发送的连接请求报文段,如果同意建立连接,在确认报文段中SYN=1,ACK=1,同时选择一个初始序号seq=y,确认号ack=x+1,此时同样需要消耗一个序号,然后服务进程进入SYN_RCVD(同步接收)状态;

客户进程收到服务进程的响应后,再次给出确认,发送ACK=1,序号seq=x+1,确认序号ack=y+1,此时可以携带数据,如果该报文不携带数据则需要消耗一个序号,此时客户进程进入ESTABLISHED(已建立连接)状态,若服务进程收到确认报文,则也进入ESTABLISHED状态;

在这里插入图片描述
三次握手的必要性:
在建立连接的过程中,第一次建立连接的请求由于网络阻塞或其他原因服务进程没有及时收到连接请求,延误到某个时刻到达服务进程,此时该连接请求实际上已经失效,如果没有第三次握手,当客户进程收到这个连接请求时,误以为客户进程又发出新的连接请求,于是服务进程像客户进程发出确认报文,同意建立连接,那么只要服务进程发出确认信号,新的连接就会建立;由于该建立连接请求实际上已经失效,客户进程也没有发出新的连接请求,此时客户进程处于CLOSED状态,因此对服务进程的确认信号不会作出相应,通过是否存在第三次握手服务进程能判断客户进程是否发出新的请求,避免误认为连接已建立的这种情况;


TCP四次挥手

客户进程主动关闭TCP连接,连接释放报文段的终止控制位FIN=1,序号sqe=u,u为已经发送数据最后一个字节的序号加1,此时客户进程进入FIN-WAIT1(终止等待1)状态,等待服务进程连接释放确认;

服务进程收到客户进程的连接释放报文段,发出确认报文段,ACK=1,确认号ack=u+1,序号seq=y,y为服务进程发送数据最后一个字节序号加1,然后服务进程进入CLOSE-WAIT(关闭等待)状态,此时客户进程到服务进程这个方向的TCP连接被释放,TCP连接处于半关闭状态(HALF-CLOSE),即客户进程不会向服务进程发送数据;但服务进程向客户进程发送数据,客户进程仍能接收,即服务进程到客户进程方向的连接未关闭;

客户进程收到服务进程的确认报文段后进入(FIN-WAIT2)终止等待2状态,等待服务进程发出连接释放报文段;

若此时服务进程没有数据要发送,则服务进程发出连接释放请求,FIN=1,序号seq=w,w为服务进程已经发送数据最后一个字节的序号加1,且重复发送上次发送的确认号ack=u+1,然后服务进程进入LAST-ACK(最后确认状态),等待客户进程确认;

客户进程收到服务进程的连接释放请求,在确认报文段中ACK=1,确认号ack=w+1,序号seq = u+1,然后进入TIME-WAIT(时间等待)状态经过两个最长报文段寿命MSL(建议2分钟),服务进程进入CLOSED状态

服务进程收到客户进程的确认报文段后进入CLOSED 状态;
在这里插入图片描述
等待两个MSL的必要性:
a、保证客户进程最后的确认报文能够到达服务进程,若服务进程没有收到最后的确认报文段,服务进程超时重传FIN+ACK请求释放连接报文,保证客户进程和服务进程都能进入CLOSED状态;
b、保证该连接持续时间内所产生的所有报文都从网络中消失,不会出现失效请求报文这样的情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值