2.TCP连接管理---<<TCP/IP详解 卷一:协议 第十三章>>

217 阅读5分钟

2.1 TCP连接的建立与终止

  • TCP连接的组成:一对端点或则套接字组成(两个IP地址和端口)

  • 连接的阶段:启动,数据传输(连接建立),和退出

  • TCP连接的建立

    1. 主动开启者(客户端)发送一个SYN报文段,并指明自己要连接的端口号和他的客户端初始序列号(ISN(c))
    2. 服务器也发送自己的SYN报文段作为响应,包含了服务器的初始序列号(ISN(s)).为了确认客户端的SYN,服务器将其包含的ISN(c)数据加1作为返回的ACK数值.每发送一个SYN,序列号码就会加1.如果丢包,该SYN就会重传.
    3. 为了确认服务器的SYN,客户端将ISN(s)的数值加1作为返回的ACK值.

    通过上述3个报文段能够完成一个TCP连接的建立,通常称为三次握手.三次握手的目的不仅让通信双方了解一个连接的建立,还可以利用数据包的选项来承担特殊的信息,交换序列号.

    首次发送SYN的一方被认为是主动打开一个连接,通常是一个客户端.连接的另外一个会接受这个SYN,并发送下一个SYN,因此被称作被动的打开一个连接.通常是称为服务器.

  • TCP连接的关闭(发送一个FIN报文段)

    1. 连接的主动关闭者发送一个FIN段申明自己的序列号(K).FIN段包含了一个ACK段用于确认最近一次的发来的数据.

    2. 连接的被动关闭者将K的数值加1作为响应的ACK值,表明自己已经成功接收到了主动关闭者发送的FIN.同时上层的应用程序会被告知连接的另外一端已经提出了关闭的请求.应用程序发起自己的关闭操作.接着,被动关闭者将身份转换成主动关闭者,发送自己的FIN.

    3. 为了完成连接的关闭,最后的发送的报文段还包含一个ACK用于确认上一个FIN值.注意的是,如果出现FIN丢失的情况,那么发送方将重新传输直到接受到一个ACK确认为止.

    *

    • telnet 连接远程主机,测试端口号

2.2 TCP选项

2.3 TCP状态转换

2.3.1 TCP状态转换图

*

  • SYN_SENT:客户端在发送请求之后等待匹配的连接请求,通过connect()函数向服务器发出一个同步(SYN)信号后进入此状态
  • LISTEN:服务器等从任意远程TCP端口的连接请求
  • SYN_RECEIVED:服务器已经收到并发出同步(SYN)信号之后等待确认(ACK)请求
  • ESTABLISHED:服务器与客户端的连接已经打开,收到的数据可以发送给用户.数据传输步骤正常情况.此时连接的两端的平等的.这时称为全连接
  • FIN_WAIT1:客户端或则服务端主动关闭调用close()函数发出FIN包,表示本方的数据全部结束等待TCP连接另一端的ACK确认包或FIN&ACK请求包
  • FIN_WAIT_2:主动关闭在FIN_WAIT_1状态下收到的ACK确认包,进入等待远程TCP的连接终止请求的半关闭状态,这时可以接受数据,但不发送数据
  • CLOSE_WAIT:被动关闭端接到FIN后,接发出ACK以回应FIN请求,并进入等待本地用户的连接终止请求的半关闭状态.这时可以发送数据,但不再接受数据
  • CLOSING:在发出FIN后,又收到对方发来的FIN后,进入等待对方对方对己方的连接终止(FIN)确认(ACK)的状态.
  • LAST_ACK:被动关闭端全部数据发出完成之后,向主送关闭端发送FIN,进入等待确认包的状态
  • TIME_WAIT:主动关闭端接受到FIN后,接发出ACK包,等待足够的时间以确保被动关闭端收到了终止请求的确认包.
  • CLOSED:完全没有连接

TIME_WAIT状态也称为2MSL等待状态.TCP将会等待两倍于最大段生存期(Maximum Segment Lifetime,MSL)的时间,有时也称作加倍等待

2.4 与TCP连接管理相关的攻击

SYN泛洪是一种拒绝服务攻击,一个或则多个客户端产生一系列TCP连接尝试(SYN报文段),并将它们发给一条服务器,通常采用伪造的源IP地址.服务器会为每一条连接分配一定数量的连接资源.由于连接尚未完全建立,服务器为了维护大量的半打开的连接会会耗尽自身的内存,然后拒绝后续合法的连接请求.

  • 预防机制:SYN cookies
    • 思想:接收到一个SYN时,这条连接存储的大部分信息会被编码并保存在SYN + ACK报文段的序列号字段.采用SYN cookies 的目标主机不需要为进入的连接请求分配任何存储资源----只有当SYN + ACK 报文段本身被确认后(并且返回初始序列后)才会分配真正的内存.

2.5 TCP的应用

实时应用并不需要甚至无法忍受TCP的可靠传输机制。在这种类型的应用中,通常允许一些丢包、出错或拥塞,而不是去校正它们。例如通常不使用TCP的应用有:流媒体、网络游戏、IP电话(VoIP)等等。任何不是很需要可靠性或者是想将功能减到最少的应用可以避免使用TCP。在很多情况下,当只需要多路复用应用服务时,用户数据报协议(UDP)可以代替TCP为应用提供服务。