UNIX网络编程-第2章-2.1-2.10
来源:互联网 发布:windows仿mac dock栏 编辑:程序博客网 时间:2024/06/01 22:00
第二章 传输层:TCP、UDP、和SCTP
2.1 概述
本章的焦点是传输层,包括TCP,UDP和SCTP。本章阐述以下相关主题:TCP的三路握手、TCP的连接终止序列、TCP的TIME_WAIT状态;SCTP的四路握手、和SCTP的连接终止;套接字层提供的TCP,UDP,SCTP的缓冲机制。
2.2 总图
BPF : 伯克利分组过滤器,该接口提供对于数据链路层的访问能力,通常可以在源自Berkerly的内核中找到。
DLPI : 数据链路提供者接口,该接口也提供对于数据链路层的访问能力,通常随SVR4内核提供。
IGMP : 用于多播,在IPv4中可选。
ICMPv6: ICMPv6综合了ICMPv4,IGMP,和ARP的功能。
2.3 用户数据报协议(UDP)
特点:UDP不保证UDP数据包会到达其最终目的地,不保证各个数据包按序达到,不保证不重复到达,所有可靠性交给应用层保证。UDP数据包拥有记录边界,如果一个数据包正确的到达其目的地,那么该数据报的长度将随数据一起传递给接收短应用进程。而TCP是一个字节流协议,没有任何记录边界。
2.4 传输控制协议(TCP)
特点:面向链接,排序,支持重传,全双工
面向连接:TCP提供客户与服务器之间的连接,TCP客户首先与某个给定服务器建立一个连接,然后跨该连接与那个服务器交换数据,然后终止该链接。
TCP含有动态估算客户和服务器之间的往返时间RTT的算法。
提供流量控制:TCP总是告知对方在任何时刻他一次可以从对方接收多少字节的数据,这称为通告窗口。在任何时刻,该窗口指出接收缓冲区中当前可用空间的量,从而确保发送端发送的数据不会使得接收缓冲区溢出。该窗口时刻动态变化,当接收到TCP报文的时候,窗口减小,当TCP客户端读取报文的时候,该窗口增大。当TCP对应某个套接字的接收缓冲区已满,它必须等待应用从该缓冲区中读取数据,方能从对方接收数据。
因此,操作系统为每一个套接字保留一个窗口。
2.5 流量控制传输协议(SCTP)
特点:面向消息,可靠,排序,流量控制,全双工,多宿
面向消息:提供对各个记录的按序递送服务,与UDP一样,由发送端写入的每条记录的长度随数据一道传递给接收端应用。
多宿:SCTP能够在所链接的端点之间提供多个流,每个流各自可靠的按序递送消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的递送。这种做法正好与TCP相反,TCP连接中若发生错误将会阻塞随后的数据传送直至错误被修复。
2.6 TCP连接的建立和终止
2.6.1 三路握手,TCP连接的建立过程:
(1)服务器必须做好准备,接受外来的连接。者通常通过调用socket,bind,和listen这三个函数来完成,我们称之为被动打开。
(2)客户通过connect发起主动连接,客户发送SYN分节通知服务器。该分节包括:发送数据的初始序列号。该分节不包含数据。该分节所在的IP数据包只包含一个IP首部,一个TCP首部,以及可能的TCP选项。
(3)服务器必须确认客户的SYN分节(发送ACK分节,响应客户端期望的发送数据的初始序列号的下一个序列号)。同时自己自己也发送一个SYN分节,它含有服务器在同一连接中发送的数据的初始序列。服务器在单个分节中完成对客户SYN的ACK以及发送自己的SYN。
(4)客户段发送对服务器的SYN的确认ACK分节,至此,客户端connect返回,服务器接受到来自对自己SYN分节的客户确认之后accept返回,三次握手完成,客户服务器TCP连接建立。
三路握手连接建立的图解:
2.6.2 TCP选项
TCP选项,每一个SYN分节可以有多个TCP选项:
MSS选项:该选项通告对方它的最大分节大小,即MSS,也就是它在本连接的每个TCP分节中愿意接受的最大数量。发送端使用接受端的MSS作为发送数据的最大分节大小。
窗口规模选项:TCP连接任何一端能够通告对端的最大窗口大小是65535,为了突破这个限制,可以使用TCP窗口规模选项。
时间戳选项:该选项可以防止失而复现的分组可能造成的数据损坏。
2.6.3 TCP连接终止
TCP建立一个连接需要3个分节,终止一个连接需要4个分节。 (1)某个应用程序首先调用close,我们称该端执行主动关闭,该段的TCP于是发送一个FIN分节,表示数据发送完毕。 (2)接受这个FIN的对端执行被动关闭。这个FIN由TCP确认。他的接收也作为一个文件结束符传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN的接受意味着接收端进程在相应连接上再无额外数据可接收。 (3)一段时间后,接收到这个文件结束符的应用进程调用close关闭它的套接字。这将导致它的TCP也发送一个FIN分节。 (4)接受这个最终FIN的原发送端TCP(即执行主动关闭的那一端确认这个FIN。
TCP连接终止的过程如下:
2.6.4 TCP状态转换图
在TCP整个生命周期中,客户端和服务器端一直处于不同的状态当中。 其状态转换图如下:
2.6.5 观察分组
观察分组的状态图如下:
2.7 TIME_WAIT状态
在TCP连接的状态转换图中,我们看到,执行主动关闭的客户端最后处于TIME_WAIT状态,并在该状态等待2MSL(最长分节生命期)。TIME_WATI状态有两个存在的理由:(1)可靠的实现TCP全双工连接的终止。(2)允许老的重复分节在网络中消逝。
TCP必须防止来自某个连接的老的重复的分组在该连接已经终止后再现,从而被误解成属于同一连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。既然TIME_WAIT状态的持续时间是MSL的两倍,这足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃。通过实施这个规则,我们就能够保证每成功建立一个TCP连接,接收到的数据报一定不是之前某个化身的老的分组。
2.8 SCTP关联的建立和终止
与TCP一样,SCTP也是面向连接的,因而也有关联建立与终止的过程,不过SCTP的握手过程不同与TCP的握手过程。
2.8.1 四路握手,SCTP关联的建立
SCTP关联建立的过程如下:(1)服务器必须准备好接受外来的关联。这通常调用socket,bind和listen这3个函数来完成,称为被动打开。(2)客户通过connect调用或者发送一个隐式打开该关联的消息进行主动打开。在该过程中,客户SCTP发送一个INIT消息。该消息的作用是: 告知服务器客户的IP地址清单,初始序列号,用于标志本关联中所有分组的起始标记,客户请求的外出流的数目,以及客户能够支持的外来流的数目。(3)服务器发送INIT ACK分节确认客户INIT分节。INIT ACK分节中包含以下信息: 服务器的IP地址清单,初始序列号,用于标志本关联所有分组的起始标记,服务器请求的外出流数目,服务器能够支持的外来流的数目,以及一个状态cookie。该状态cookie的作用是:包含服务器用于确信本关联有效所需的所有状态,它是数字化签名过的,以确保其有效性。(4)客户以一个COOKIE ECHO分节,回射服务器的状态cookie。除COOKIE ECHO外,该消息可能在同一个分组中还捆绑了用户数据。(5)服务器以一个COOKIE ACK消息确认客户回射的cookie是正确的,本关联于是建立。该消息可能在同一个分组中还捆绑了用户数据。该四路握手建立的过程如下:
SCTP的四路握手在很多方面类似与TCP的三路握手,差别主要在于作为SCTP整体一部分的cookie生产。INIT(随众多参数一起)承载一个验证标记Ta,和一个初始序列号J。在关联的有效期内,验证标记Ta必须在对端发送的每个分组中出现。初始序列号J用作承载用户数据DATA块的起始序列号。对端也在INIT ACK中承载一个验证标记Tz,在关联的有效期内,验证标记Tz也必须在其发送的每一个分组中出现。除了验证标记Tz和初始序号K外,INIT的接收端还在作为响应的INIT ACK中提供一个cookie C。该cookie包含设置本SCTP关联所需的所有状态,这样服务器的SCTP栈就不必保存所关联的有关信息。
在SCTP中使用四路握手是为了避免拒绝服务攻击。
2.8.2 关联终止
当一端关闭某个关联的时候,另一端必须停止发送新的数据。关闭关联请求的接收端发送完已经排队的数据后,完成关联的关闭。 终止关联的过程如图示:
SCTP没有类似与TIME_WAIT的状态,因为SCTP使用了标记验证,旧的分组的验证标记必然和某一连接的化身的标记不同,从而避免了TCP在TIME_WAIT状态保持整个连接的做法。
2.8.3 SCTP的状态转换过程如下:
2.8.4 观察分组
观察分组的分组交换过程如下:
2.9 端口号
端口号分类如下:(1)众所周知的端口,由IANA管理,0-1023;(2)已登记端口,1024-49151;(3)临时端口,49152-65535;
注意,一个套接字对是一个四元组,唯一标志网络中的一台主机。
2.10 TCP端口号与并发服务器
- UNIX网络编程-第2章-2.1-2.10
- unix网络编程第1章:简介
- Unix网络编程上卷--第5章
- unix网络编程-第3,4章套接字编程
- unix网络编程-第3,4章套接字编程
- 《UNIX网络编程 卷一》第2章:各网络协议的用途
- Unix网络编程代码 第1章 简介
- Unix网络编程代码 第7章 套接字选项
- Unix网络编程代码 第17章 ioctl操作
- Unix网络编程代码 第20章 广播
- Unix网络编程代码 第28章 原始套接字
- Unix网络编程学习笔记之第1章 简介
- 【UNIX网络编程】第26章 线程总结
- UNIX网络编程第2卷----函数索引
- unix网络编程第2章:传输层:TCP,UDP和SCTP
- Unix网络编程学习笔记之第2章 TCP和UDP
- UNIX网络编程第2版,第2卷,进程间通信:英文影印版
- UNIX网络编程 : 第2版. 第2卷, 进程间通信(中文版)
- hiberante 中sql查询, createSqlQuery 的具体用法
- command not found
- notepad++搭建C语言环境(Dev c++)
- 剑指offer(六十三)之数据流中的中位数
- T2:滑雪(cowski.pas/c/cpp)
- UNIX网络编程-第2章-2.1-2.10
- Cloudera Hadoop架构及Hadoop Common实现原理
- 用python做个弹球游戏(一)
- sql函数操作
- 一念永恒 > 第八十四章 难以置信的爆发
- 一念永恒 > 第八十六章 又来这套……
- 一念永恒 > 第八十五章 他是……第一?
- spring 自动装配
- 二分算法C实现