2.TCP链接管理---< >

2.1 TCP链接的创建与终止

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

  • 链接的阶段:启动,数据传输(链接创建),和退出markdown

  • TCP链接的创建cookie

    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)的时间,有时也称做加倍等待spa

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

SYN泛洪是一种拒绝服务攻击,一个或则多个客户端产生一系列TCP链接尝试(SYN报文段),并将它们发给一条服务器,一般采用伪造的源IP地址.服务器会为每一条链接分配必定数量的链接资源.因为链接还没有彻底创建,服务器为了维护大量的半打开的链接会会耗尽自身的内存,而后拒绝后续合法的链接请求.3d

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

2.5 TCP的应用

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

相关文章
相关标签/搜索