linux下的c语言网络网络编程面试题,Linux C/C++面试之《网络编程系列》(3) tcp三次握手若干问题...

tcp建立连接时的三次握手几乎是校招面试在考察网络编程知识时,必问的一个问题。必须清楚的知道tcp三次握手的流程,面试官可能会拿出一张白纸,让你简单画出该流程,然后展开追问。

tcp建立连接三次握手流程

tcp三次握手的流程如下(客户端主动发起连接):

c6b1d13aa54a4ca07a0915f74348063b.png

建立过程为:

(1)B首先建立传输控制块TCB,进入LISTEN(收听)状态,等待用户的连接请求。如有,则建立连接。(这个过程在套接字编程中为服务器端调用socket函数、bind函数和listen函数的过程)

备注:一个TCB数据块包含了数据发送双方对应的socket信息以及用于装载数据的缓冲区。在两个设备要建立连接发送数据之前,双方都必须要做一些准备工作,分配内存建立起TCB数据块就是连接建立前必须要做的准备工作。

(2)A建立传输控制块TCB,然后向B发送连接请求报文段,报文段中首部的同步位SYN=1,同时选择一个序列号seq=x(实际测试是0),TCP规定SYN报文段不携带数据,但要消耗一个序列号。然后A进入SYN-SENT(同步已发送)状态。(这个过程在套接字编程中为客户端调用socket函数和connect函数的过程)

(3)B收到请求后,如同意建立连接,就向A发送确认报文段。此时SYN=1、ACK=1,确认号ack=x+1,同时选择一个序列号seq=y,这个报文也不携带数据,但要消耗一个序列号。然后B进入SYN-RCVD状态(同步收到)。

(4)A收到B的确认后,还要向B发送确认。确认报文段的ACK=1,确认号ack=y+1,seq=x+1。TCP规定,ACK报文段可以携带数据,而如果不携带数据则不消耗序列号,此时下一个报文段的序列号仍为seq=x+1。这时,连接就建立成功了,A进入ESTABLISHED状态(已建立连接状态)。

(5)当B收到A的确认后,也进入ESTABLISHED状态,此时就可以进行数据传输了。

当然,在进行三次握手时不是仅进行连接,可能还会进行一些后续操作所需要的信息交流。

为何是三次握手而非两次?

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值