TCP协议详解(理论篇)
本文关键词:tcp协议,由笔耕文化传播整理发布。
> 网络协议 > 正文 tcp协议详解(理论篇) 2012-08-20 作者:陈立龙 我要投稿
tcp协议详解(理论篇)
1. 与UDP不同的是,TCP提供了一种面向连接的、可靠的字节流服务。面向连接比较好理解,就是连接双方在通信前需要预先建立一条连接,这犹如实际生活中的打电话。助于可靠性,tcp协议中涉及了诸多规则来保障通信链路的可靠性,总结起来,主要有以下几点:
(1)应用数据分割成TCP认为最适合发送的数据块。这部分是通过“MSS”(最大数据包长度)选项来控制的,通常这种机制也被称为一种协商机制,MSS规定了TCP传往另一端的最大数据块的长度。值得注意的是,MSS只能出现在SYN报文段中,若一方不接收来自另一方的MSS值,则MSS就定为536字节。一般来讲,在不出现分段的情况下,MSS值还是越大越好,这样可以提高网络的利用率。
(2)重传机制。设置定时器,等待确认包。
(3)对首部和数据进行校验。
(4)TCP对收到的数据进行排序,然后交给应用层。
(5)TCP的接收端丢弃重复的数据。
(6)TCP还提供流量控制。(通过每一端声明的窗口大小来提供的)
2. TCP包的首部:
(1) 若不计选项字段,TCP的首部占20个字节。
(2) 源端口号以及目的端口号用于寻找发端和接收端的进程,一般来讲,通过端口号和IP地址,可以唯一确定一个TCP连接,在网络编程中,通常被称为一个socket接口。
(3) 序号是用来标识从TCP发端向TCP接收端发送的数据字节流。
(4) 确认序号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应该是上次已经成功收到数据字节序号加1.
(5) 首部长度指出了TCP首部的长度值,若不存在选项,则这个值为20字节。
(6) 标志位(flag):
URG: 紧急指针有效
ACK:确认序号有效
PSH:接收方应尽快将这个报文段交给应用层
RST:重建连接
SYN:同步序号用来发起一个连接
FIN: 发端完成发送任务(主动关闭)
【解释】
◆ TCP提供解决方式是为了使一端告诉另外一端某些“紧急数据”已经放置在普通的数据流中,让接收端对紧急数据做特别处理。此时,URG位被置为1,并且16位的紧急数据被置为一个正的偏移量,通过此偏移量与TCP首部中的序号字段相加,可以得出紧急数据的最后一个字节的序号,常见的应用有传输中断键(在通过telnet连接过程中)。
◆ RST: 复位字段被用于当一个报文发送到某个socket接口而出现错误时,TCP则会发出复位报文段。常见出现的情况有以下几种:
发送到不存在的端口的连接请求:此时对方的目的端口并没有侦听,对于UDP,将会发出ICMP不可达的 错误信息,而对于TCP,将会发出设置RST复位标志位的数据报。异常终止一个连接:正常情况下,通过发送FIN去正常关闭一个TCP连接,但也有可能通过发送一个复位 报文段去中途释放掉一个连接。在socketAPI中通过设置socket选 项SO_LINGER去关闭这种异常关闭的情况。
3. TCP的连接与终止过程:
(1) 三次握手:
建立一个TCP连接,必须经历三次握手过程,其中发送第一个SYN的一端将执行主动打开,接收这个SYN并发回下一个SYN的另一端执行被动打开。
(2) 四次释放:
要释放一个TCP连接,需要通过四次握手过程,这是由TCP的半关闭特性造成的,因为TCP连接时全双工的,因此,需要TCP两端要单独执行关闭。值得注意的是,,主动关闭的一端在发送FIN之后,依然还能正常接收对方的数据,只是通知对方它已经没有数据需要发送了,同理,被动关闭的一端在收到FIN之后,仍然可以发送数据,直到它自身同样发出FIN之后,才停止发送数据。
(3) TCP连接的超时问题:
完成一个TCP连接,中间涉及到一个超时的问题,大多数伯克利系统的超时时限为75s,Solaris9的超时时限为240s,因此,一般认为是在75-240之间。
【引申】在具体的实现中,如何由用户自己去完成设置socket连接超时时间?
【解决方法】目前实现socket超时连接主要是通过select来完成的。具体步骤如下:
◆ 建立socket
◆ 将socket设置为非阻塞模式(若是阻塞模式,那么时间设置就毫无意义)
◆ 调用connect去进行连接
◆ 使用select检查socket是否可写,并同时判断其结果(为什么是可写?因为需要检测socket是否收到ACK。)
◆ 将socket转化为阻塞模式
(4)TCP的半关闭
所谓“半关闭”,是指连接的一端在结束它的发送之后还能接收到对方发过来的数据的能力。具体表现在,当完成三次握手的双方,其中有一端发出FIN,此时它将进入半关
闭状态,此时它关闭了自身的发送功能,但是它依然可以接收到对方的数据,如对方发过来的ACK消息。那么在实际开发中,是怎么实现的呢?
这牵涉到系统中shutdown和close函数的区别问题。
int shutdown(int s, int how)
本文关键词:tcp协议,由笔耕文化传播整理发布。
本文编号:159033
本文链接:https://www.wllwen.com/wenshubaike/xxkj/159033.html