TCP连接的建立和关闭详解

1. TCP建立连接(三次握手)

下面两个图是从协议和接口两个角度来解释TCP的三次握手过程(分别摘自计算机网络-谢希仁和UNIX网络编程卷1):

这里写图片描述
这里写图片描述

1.1. tcpdump三次握手

下面通过tcpdump来查看tcp建立连接的过程:用nc命令来进行测试,

server:nc –l 9000
client:nc 9000

[anonymalias@qcloud ~]$sudo tcpdump -i lo port 9000 -X –S

tcpdump默认情况下,只会在SYN报文段中显示绝对的sequence number, 其他报文段只会显示相对的sequence number,所以需要加上-S才能在握手以外的阶段显示绝对sequence number。-X参数用于解析和显示每一个包的包头和包体。这里只显示IP header + TCP packet, 不显示链路层link level的头部。
这里写图片描述
图中第一个tcp建立连接的请求包中6个控制位字段:URG|ACK|PSH|RST|SYN|FIN,SYN置为1,表示是一个连接请求包;
图中第二个tcp包为服务器对连接请求的应答包,6个控制位字段:URG|ACK|PSH|RST|SYN|FIN,ACK和SYN均置为1,表示连接请求的应答包。TCP协议规定,链接建立后,所有的报文的ACK控制位必须置为1
图中第三个tcp包为客户端对应答包的确认包,6个控制位字段:URG|ACK|PSH|RST|SYN|FIN,ACK置为1。

对于tcp建立链接的过程,控制位SYN只有在链接建立前两次握手中会置为1, 其他阶段的包该控制位不能设置。控制位ACK,在第二次握手开始及以后会一直置为1,直到最后一个报文包。

  • 为什么要采用三次握手,而不是两次握手

这主要是为了防止已失效的连接请求报文段突然又传送到服务器,产生错误。
已失效的连接请求报文段的产生原因:当客户A发送连接请求,但因连接请求报文丢失而未收到确认。于是A会再次重传一次连接请求,此时服务器端B收到再次重传的连接请求,建立了连接,然后进行数据传输,数据传输完了后,就释放了此连接。假设A第一次发送的连接请求并没有丢失,而是在网络结点中滞留了太长时间,以致在AB通信完后,才到达B。此时这个连接请求其实已经是被A认为丢失的了。如果不进行第三次握手,那么服务器B可能在收到这个已失效的连接请求后,进行确认,然后单方面进入ESTABLISHED状态,而A此时并不会对B的确认进行理睬,这样就白白的浪费了服务器的资源。

1.2. tcp同时打开

TCP协议也是支持同时打开的,尽管这个概率是非常小的,因为这要求通信双方都知道对方的端口号,这需要双方都事先bind()各自的端口,并同时发出SYN包。TCP针对同时打开的情况,仅建立一条连接而不是两条连接。
对于同时打开连接的双方,在发送SYN包后,都进入SYN_SEND状态,在收到对端的SYN包后,进入SYN_RCVD状态,并对此SYN包再次回复SYN包进行确认,当双方都收到对端的SYN包ack后,就会进入ESTABLISHED状态。如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值