TCP建立和终止

(本文参考了《unix网络编程》)
主要内容分为以下两部分:
1、tcp客户端和服务器一些典型事件概述;
2、TCP连接的建立和终止;

1、
1.1、tcp客户端和服务器一些典型事件时间表如下:
这里写图片描述

1.2、
connect函数出错时主要有以下几种情况:
1、TCP客户未收到SYN分节的响应,返回ETIMEDOUT;
2、对客户的响应为RST,表明该服务器在指定端口上没有进程在等待与之连接(比如服务器进程未启动),称为硬错,客户端会即刻返回错误ECONNREFUSED;
3、客户端发出的SYN在中间的路由器上引发了一个目的地不可达ICMP错误,称为软错。此时客户端会保存此错误,并按一定时间间隔连续发出SYN,若在规定时间后仍未收到响应,则把保存的ICMP错误作为EHOSTUNREACH或ENETUNREACH错误返回给进程;

需要注意的是,当进程调用connect失败后,该套接口必须关闭,如果想重新connect,需要再次调用socket函数。

1.3、
Bind()函数会把一个特定IP地址绑定到套接口,对于TCP客户,此地址就是所发送数据报的源ip地址,因为TCP服务器的套接口只接受目的地为此IP的客户连接。如果TCP服务器不绑定IP,内核会把客户所发SYN所在分组的目的IP地址作为服务器的源IP地址。
要注意的是,如果内核为套接口选择了一个临时端口时,bind无法返回所选择的值,因为第二个参数有const,可调用函数getsockname()返回协议地址。

1.4、
Listen()函数的作用在于将一个未连接的套接口转变为被动套接口,并规定内核为此套接口排队的最大连接数量。
对于给定的监听套接口,内核要维护两个队列,一个是未完成连接队列,一个是已完成连接队列(已完成三次握手)。
三次握手过程如下图示:
这里写图片描述

要注意,当一个客户SYN到达时,若两个队列都是满的,TCP会忽略此分节。且不发送RST,让TCP的重传机制来处理,期待不久就可以在队列中找到空闲条目。

1.5、
三次握手完成后而服务器调用accept之前到达服务器的数据由TCP排队,最大数据量为已连接套接口的接收缓冲区大小。
通常我们把accept()第一个参数称为监听套机口,把函数返回值称为已连接套接口,是内核为被接受的客户连接创建的。已连接套接口在服务器完成该客户的服务后会被关闭,而监听套接口在整个服务器有效期间都保持开放。

2、TCP连接的建立和终止,通过三次握手和四次挥手实现
2.1、三次握手过程,主要包含以下几步:
(1)服务器被动打开(socket()->bind()->listen());
(2)客户端主动打开(socket()->connect()),此时客户TCP向服务器发送一个SYN分节,它会告诉服务器客户将在待建立的连接中发送的数据的初始序列号j。一般情况下,SYN分节不携带数据,只含有一个IP头部、一个TCP头部及可能有的TCP选项;
(3)服务器确认客户的SYN,确认号为相应SYN的序列号加一(j+1),同时自己也要发送一个SYN,含有服务器将在同一连接中发送数据的初始序列号(k)。服务器以单个分节发送SYN和ACK;
(4)客户端再次确认服务器的SYN(k+1);
由于建立过程需要交换三个分组,称为三次握手,过程图如上所示。

2.2、四次挥手,终止一个连接一般需要四个分节:
(1)某进程调用close()主动关闭(客户端和服务器均可以主动关闭,通常情况下是客户端执行主动关闭),这一端的TCP发送FIN分节,表示数据发送完毕。主动结束的这一方进入TIME_WAIT状态;
(2)接收到FIN的另一端执行被动关闭。此FIN由TCP接收,其接收也作为文件结束符传递给接收方应用进程(放在已排队等候该应用进程接收的任何其他数据之后),表示在相应进程上不会再接收到数据;
(3)一段时间后,接收到文件结束符的应用进程调用close()关闭套接口,其TCP同样发送一个FIN;
(4)接收到FIN的原发送方TCP(主动关闭的一端)对它进行确认;

有时步骤1的FIN 随数据一起发送,TCP在步骤2和3发出的ACK和FIN也可以合并到一个分节,所以不一定每一次的终止都需要四个分节。过程图如下:

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值