HTTP专题--(2)TCP连接

简介

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

应用层把需要传输到网上的的字节流(8个字节表示的)交给TCP层,TCP则把这些字节流分割成合适长度的报文段(最大长度受到数据链路层的最大传送单元限制),然后交给IP层,通过网络传送到接收端的实体TCP层。

模型

这里写图片描述

如图,可以看出与OSI模型对应的关系。

报文格式

这里写图片描述

  • 源端口:16位,发送端的端口,跟源IP可以一起构成详细地址。
  • 目的端口:16位,接收端的端口。
  • 序号:32位,发送端使用,把报文分段时使用。发送数据包中的第一个字节的序列号。
  • 确认号:32位,把报文段重组时用。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。
  • 数据偏移:4位,数据开始位置。该字段的值是TCP首部(包括选项)长度除以4。
  • 保留:保留。
  • 标识:
    1. URG:紧急标志。紧急标志为”1”表明该位有效。
    2. ACK:确认标志。表明确认编号栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。
    3. PSH:推标志。该标志置位时,接收端不将该数据进行队列处理,而是尽可能快地将数据转由应用处理。在处理Telnet或rlogin等交互模式的连接时,该标志总是置位的。
    4. RST:复位标志。用于复位相应的TCP连接。
    5. SYN:同步标志。表明同步序列编号栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。
    6. FIN:结束标志。
  • 窗口:表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。
  • 校验和:16位TCP头。源机器基于数据内容计算一个数值,收信息机要与源机器数值 结果完全一样,从而证明数据的有效性。检验和覆盖了整个的TCP报文段:这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证的。
  • 紧急指针:指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。
  • 选项:长度不定,但长度必须为1个字节。如果没有选项就表示这个1字节的域等于0。

TCP连接

这里写图片描述

连接建立:

  1. 第一次握手:客户端进程发起连接请求,发起SYN=J报文,到服务端;同时进入SYS_SEND状态,等候服务器确认。
  2. 第二次握手:服务端进程监听到请求,收到SYN请求,向客户端返回确认ACK=J+1报文,同时自己也发送SYN=K报文,即:SYN+ACK。同时进入SYS_RCVD状态。
  3. 第三次握手:客户端进程接收到SYN+ACK报文后,向服务端发送ACK=K+1报文,自己进入ESTABLISHED状态。服务端接收到客户端的确认后,也进入ESTABLISHED状态。这样双方就建立起连接,就可以进行数据的传输了。

连接关闭:

  1. 第一次握手:客户端进程主动发起关闭请求,发送FIN=M报文到服务端,告知服务端“我不会再发送数据了”。但是这个时候,客户端还是能继续接受数据的。客户端进入FIN_WAIT_1状态。
  2. 第二次握手:服务端接收到关闭请求后,就回复ACK=M+1报文,告诉客户端“我知道了”。因为这个时候,服务端还没有准备好,还可能接收到网络中延迟的数据和发送数据,所以服务端进入CLOSE_WAIT状态。同时,客户端还是可以继续接受服务端的数据的,进入FIN_WAIT_2状态。
  3. 第三次握手:服务端准备好后,发送关闭请求FIN=N报文给客户端,告诉“我没有要接受或发送的数据了,准备关闭了”。同时进入LAST_ACK状态,
  4. 第四次握手:客户端接收到FIN=N报文后,确认回复ACK=N+1。但是考虑到网络包丢失情况,服务端没有收到回复。这个时候客户端还不能真正关闭,而进入TIME_WAIT状态【TIME_WAIT时间为2MSL(最大报文段生存时间)】,如果Server端没有收到ACK则可以重传。客户端等TIME_WAIT时间过后,如果还没有收到server端重新确认的请求时,进行关闭,进入CLOSED状态。而这时服务端收到回复后,进行关闭。

注意:
1. 某些情况下,第一步的FIN随数据包一起发送,另外,第二步和第三步发送的包都出自执行被动关闭那一端,如果服务端确认已经接受数据完毕和没有要发送的数据时,它们有可能被合并成一个包发送的。
2. 第二步和第三步之间,服务端还是能继续向客户端发送数据的。这称为“半关闭”(half-close)。
3. 无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。所以理解时,把客户端换成主动方,服务端换成被动方,更全面理解些的。
4. 连接处于TIME_WAIT等待时。该地址上的链接(客户端地址、端口和服务器端的地址、端口)不能被使用。比如我们在建立一个链接后关闭链接然后迅速重启链接,那么 就会出现端口不可用的情况。

如果某一方关闭或异常终止连接而另一方却不知道,将这样的TCP连接称为半打开的。这种状态可以通过Keepalive选项来进行发现两一段已经消失。还可以是:本端发送SYN,对端回应ACK+SYN,此时本端不回应ACK。
当处于半打开状态的一方重启并重新连接后,它将丢失复位前的所有信息,因此它并不知道数据报文段中提到的连接。此时就会返回RST(异常终止要发送RST置位的包)包应答,已关闭此次连接。此时只需要等待MSL时间,因为TCP默认机器重启的时间大于MSL。PIX防火墙和IDS入侵检测系统都可以伪装攻击目标发送RST的包去终止异常的TCP连接。(比如限定连接的时间,减少半开连接限制超时时间)当我们Telnet一个不存在的端口号时,本段立马收到一个拒绝访问的包,这个就是对方发送的RST包导致的。

状态的转化如下图:
这里写图片描述

客户端状态流程:

CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

服务器状态流程:

CLOSED->LISTEN->SYN_RCVD->ESTABLISHED->CLOSE_WAIT->LAST->ACK->CLOSED

可靠性

  1. 应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)。
  2. 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。TCP有延迟确认的功能,在此功能没有打开,则是立即确认。功能打开,则由定时器触发确认时间点。
  3. TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
  4. 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
  5. 既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。

TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCⅡ字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。

相关命令

netstat
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到.

  • 查看哪些IP连接本机: netstat -an
  • 统计httpd协议连接数: ps -ef|grep httpd|wc -l
  • 统计已连接上的,状态为“established”的连接数netstat -na|grep ESTABLISHED|wc -l 如果要查询具体信息,去掉后面的 |wc -l即可。
  • 查看Apache的并发请求数及其TCP连接状态: netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

TCP连接状态详解 :
LISTEN: 侦听来自远方的TCP端口的连接请求
SYN-SENT: 再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED: 代表一个打开的连接
FIN-WAIT-1: 等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2: 从远程TCP等待连接中断请求
CLOSE-WAIT: 等待从本地用户发来的连接中断请求
CLOSING: 等待远程TCP对连接中断的确认
LAST-ACK: 等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT: 等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED: 没有任何连接状态

猜你喜欢

转载自blog.csdn.net/zcl111/article/details/74922893
今日推荐