C语言项目(四)——基于Linux系统下的带有GUI界面的即时通信软件

二十一.TCP是如何保证可靠数据传输的?

TCP提供一种面向连接的、可靠的字节流服务。 
     面向连接:意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。 
 TCP通过下列方式来提供可靠性:
1、应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。                                                                  (将数据截断为合理的长度)
2、当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。                         
(超时重发)
3、当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒 。                                                                 (对于收到的请求,给出确认响应) (之所以推迟,可能是要对包做完整校验)
4、 TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。 (校验出包有错,丢弃报文段,不给出响应,TCP发送数据端,超时时会重发数据)
5、既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。  (对失序数据进行重新排序,然后才交给应用层)
6、既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。(对于重复数据,能够丢弃重复数据)
7、TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。(TCP可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出)TCP使用的流量控制协议是可变大小的滑动窗口协议。
字节流服务::
 两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。
TCP对字节流的内容不作任何解释:: TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。

二十二.七层网络模型与四层网络模型及每层的网络协议?

TCP/IP参考模型
  
  ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。如图2-1所示,是TCP/IP参考模型和OSI参考模型的对比示意图。

图2-1  TCP/IP参考模型

  2.1 TCP/IP参考模型的层次结构
  TCP/IP协议栈是美国国防部高级研究计划局计算机网(Advanced Research Projects Agency Network,ARPANET)和其后继因特网使用的参考模型。ARPANET是由美国国防部(U.S.Department of Defense,DoD)赞助的研究网络。最初,它只连接了美国境内的四所大学。随后的几年中,它通过租用的电话线连接了数百所大学和政府部门。最终ARPANET发展成为全球规模最大的互连网络-因特网。最初的ARPANET于1990年永久性地关闭。  
  TCP/IP参考模型分为四个层次:应用层、传输层、网络互连层和主机到网络层。如图2-2所示。
C语言项目(四)——基于Linux系统下的带有GUI界面的即时通信软件_第1张图片
图2-2  TCP/IP参考模型的层次结构

  在TCP/IP参考模型中,去掉了OSI参考模型中的会话层和表示层(这两层的功能被合并到应用层实现)。同时将OSI参考模型中的数据链路层和物理层合并为主机到网络层。下面,分别介绍各层的主要功能。
  
  1、主机到网络层  
  实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求能够提供给其上层-网络互连层一个访问接口,以便在其上传递IP分组。由于这一层次未被定义,所以其具体的实现方法将随着网络类型的不同而不同。  
  2、网络互连层  
  网络互连层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。  
  网络互连层定义了分组格式和协议,即IP协议(Internet Protocol)。  
  网络互连层除了需要完成路由的功能外,也可以完成将不同类型的网络(异构网)互连的任务。除此之外,网络互连层还需要完成拥塞控制的功能。  
  3、传输层  
  在TCP/IP模型中,传输层的功能是使源端主机和目标端主机上的对等实体可以进行会话。在传输层定义了两种服务质量不同的协议。即:传输控制协议TCP(transmission control protocol)和用户数据报协议UDP(user datagram protocol)。  
  TCP协议是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP协议还要处理端到端的流量控制,以避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据。  
  UDP协议是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。  
  4、应用层  
  TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。  
  应用层面向不同的网络应用引入了不同的应用层协议。其中,有基于TCP协议的,如文件传输协议(File Transfer Protocol,FTP)、虚拟终端协议(TELNET)、超文本链接协议(Hyper Text Transfer Protocol,HTTP),也有基于UDP协议的。

  2.2 TCP/IP报文格式  
  1、IP报文格式  
  IP协议是TCP/IP协议族中最为核心的协议。它提供不可靠、无连接的服务,也即依赖其他层的协议进行差错控制。在局域网环境,IP协议往往被封装在以太网帧中传送。而所有的TCP、UDP、ICMP、IGMP数据都被封装在IP数据报中传送。如图2-3所示:

图2-3  TCP/IP报文封装

  图2-4是IP头部(报头)格式:(RFC 791)。
C语言项目(四)——基于Linux系统下的带有GUI界面的即时通信软件_第2张图片
图2-4  IP头部格式
  
  其中:  
  ●版本(Version)字段:占4比特。用来表明IP协议实现的版本号,当前一般为IPv4,即0100。  
  ●报头长度(Internet Header Length,IHL)字段:占4比特。是头部占32比特的数字,包括可选项。普通IP数据报(没有任何选项),该字段的值是5,即160比特=20字节。此字段最大值为60字节。  
  ●服务类型(Type of Service ,TOS)字段:占8比特。其中前3比特为优先权子字段(Precedence,现已被忽略)。第8比特保留未用。第4至第7比特分别代表延迟、吞吐量、可靠性和花费。当它们取值为1时分别代表要求最小时延、最大吞吐量、最高可靠性和最小费用。这4比特的服务类型中只能置其中1比特为1。可以全为0,若全为0则表示一般服务。服务类型字段声明了数据报被网络系统传输时可以被怎样处理。例如:TELNET协议可能要求有最小的延迟,FTP协议(数据)可能要求有最大吞吐量,SNMP协议可能要求有最高可靠性,NNTP(Network News Transfer Protocol,网络新闻传输协议)可能要求最小费用,而ICMP协议可能无特殊要求(4比特全为0)。实际上,大部分主机会忽略这个字段,但一些动态路由协议如OSPF(Open Shortest Path First Protocol)、IS-IS(Intermediate System to Intermediate System Protocol)可以根据这些字段的值进行路由决策。  
  ●总长度字段:占16比特。指明整个数据报的长度(以字节为单位)。最大长度为65535字节。  
  ●标志字段:占16比特。用来唯一地标识主机发送的每一份数据报。通常每发一份报文,它的值会加1。  
  ●标志位字段:占3比特。标志一份数据报是否要求分段。  
  ●段偏移字段:占13比特。如果一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置。  
  ●生存期(TTL:Time to Live)字段:占8比特。用来设置数据报最多可以经过的路由器数。由发送数据的源主机设置,通常为32、64、128等。每经过一个路由器,其值减1,直到0时该数据报被丢弃。  
  ●协议字段:占8比特。指明IP层所封装的上层协议类型,如ICMP(1)、IGMP(2) 、TCP(6)、UDP(17)等。  
  ●头部校验和字段:占16比特。内容是根据IP头部计算得到的校验和码。计算方法是:对头部中每个16比特进行二进制反码求和。(和ICMP、IGMP、TCP、UDP不同,IP不对头部后的数据进行校验)。  
  ●源IP地址、目标IP地址字段:各占32比特。用来标明发送IP数据报文的源主机地址和接收IP报文的目标主机地址。  
  可选项字段:占32比特。用来定义一些任选项:如记录路径、时间戳等。这些选项很少被使用,同时并不是所有主机和路由器都支持这些选项。可选项字段的长度必须是32比特的整数倍,如果不足,必须填充0以达到此长度要求。 
 
  2、TCP数据段格式  
  TCP是一种可靠的、面向连接的字节流服务。源主机在传送数据前需要先和目标主机建立连接。然后,在此连接上,被编号的数据段按序收发。同时,要求对每个数据段进行确认,保证了可靠性。如果在指定的时间内没有收到目标主机对所发数据段的确认,源主机将再次发送该数据段。  
  如图2-5所示,是TCP头部结构(RFC 793、1323)。
C语言项目(四)——基于Linux系统下的带有GUI界面的即时通信软件_第3张图片
图2-5  TCP头部结构  
  ●源、目标端口号字段:占16比特。TCP协议通过使用"端口"来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端口"(Well-Know Port)为用户提供服务。
  ●顺序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。  
  ●确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。  
  ●头部长度字段:占4比特。给出头部占32比特的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。  
  ●标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:  
  ◆URG:紧急指针(urgent pointer)有效。  
  ◆ACK:确认序号有效。  
  ◆PSH:接收方应该尽快将这个报文段交给应用层。  
  ◆RST:重建连接。  
  ◆SYN:发起一个连接。  
  ◆FIN:释放一个连接。  
  ●窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。  
  ●TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。  
  ●紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。  
  ●选项字段:占32比特。可能包括"窗口扩大因子"、"时间戳"等选项。
  
  3、UDP数据段格式  
  UDP是一种不可靠的、无连接的数据报服务。源主机在传送数据前不需要和目标主机建立连接。数据被冠以源、目标端口号等UDP报头字段后直接发往目的主机。这时,每个数据段的可靠性依靠上层协议来保证。在传送数据较少、较小的情况下,UDP比TCP更加高效。  
  如图2-6所示,是UDP头部结构(RFC 793、1323):
C语言项目(四)——基于Linux系统下的带有GUI界面的即时通信软件_第4张图片
  ●源、目标端口号字段:占16比特。作用与TCP数据段中的端口号字段相同,用来标识源端和目标端的应用进程。  
  ●长度字段:占16比特。标明UDP头部和UDP数据的总长度字节。  
  ●校验和字段:占16比特。用来对UDP头部和UDP数据进行校验。和TCP不同的是,对UDP来说,此字段是可选项,而TCP数据段中的校验和字段是必须有的。  

  2.3 套接字  
  在每个TCP、UDP数据段中都包含源端口和目标端口字段。有时,我们把一个IP地址和一个端口号合称为一个套接字(Socket),而一个套接字对(Socket pair)可以唯一地确定互连网络中每个TCP连接的双方(客户IP地址、客户端口号、服务器IP地址、服务器端口号)。
  
  如图2-7所示,是常见的一些协议和它们对应的服务端口号。
C语言项目(四)——基于Linux系统下的带有GUI界面的即时通信软件_第5张图片
图2-7  常见协议和对应的端口号
  
  需要注意的是,不同的应用层协议可能基于不同的传输层协议,如FTP、TELNET、SMTP协议基于可靠的TCP协议。TFTP、SNMP、RIP基于不可靠的UDP协议。  
  同时,有些应用层协议占用了两个不同的端口号,如FTP的20、21端口,SNMP的161、162端口。这些应用层协议在不同的端口提供不同的功能。如FTP的21端口用来侦听用户的连接请求,而20端口用来传送用户的文件数据。再如,SNMP的161端口用于SNMP管理进程获取SNMP代理的数据,而162端口用于SNMP代理主动向SNMP管理进程发送数据。  
  还有一些协议使用了传输层的不同协议提供的服务。如DNS协议同时使用了TCP 53端口和UDP 53端口。DNS协议在UDP的53端口提供域名解析服务,在TCP的53端口提供DNS区域文件传输服务。

  2.4 TCP连接建立、释放时的握手过程  
  1、TCP建立连接的三次握手过程  
  TCP会话通过三次握手来初始化。三次握手的目标是使数据段的发送和接收同步。同时也向其他主机表明其一次可接收的数据量(窗口大小),并建立逻辑连接。这三次握手的过程可以简述如下:  
  ●源主机发送一个同步标志位(SYN)置1的TCP数据段。此段中同时标明初始序号(Initial Sequence Number,ISN)。ISN是一个随时间变化的随机值。  
  ●目标主机发回确认数据段,此段中的同步标志位(SYN)同样被置1,且确认标志位(ACK)也置1,同时在确认序号字段表明目标主机期待收到源主机下一个数据段的序号(即表明前一个数据段已收到并且没有错误)。此外,此段中还包含目标主机的段初始序号。  
  ●源主机再回送一个数据段,同样带有递增的发送序号和确认序号。  
  至此为止,TCP会话的三次握手完成。接下来,源主机和目标主机可以互相收发数据。整个过程可用图2-8表示。
C语言项目(四)——基于Linux系统下的带有GUI界面的即时通信软件_第6张图片
  2、TCP释放连接的四次握手过程

 

二十三.如果只有UDP协议,你如何保证可靠传输?

如何让UDP实现可靠传输

自定义通讯协议,在应用层定义一些可靠的协议,比如检测包的顺序,重复包等问题,如果没有收到对方的ACK,重新发包

UDP没有Delievery Garuantee,也没有顺序保证,所以如果你要求你的数据发送与接受既要高效,又要保证有序,收包确认等,你就需要在UDP协议上构建自己的协议。比如RTCP,RTP协议就是在UPD协议之上专门为H.323协议簇上的IP电话设计的一种介于传输层和应用层之间的协议。

下面分别介绍三种使用UDP进行可靠数据传输的协议 
RUDP 
RTP 
UDT

RUDP(Reliable User Datagram Protocol) 
可靠用户数据报协议(RUDP)是一种基于可靠数据协议(RDP: RFC908 和 1151 (第二版))的简单分组传输协议。作为一个可靠传输协议,RUDP 用于传输 IP 网络间的电话信号。它允许独立配置每个连接属性,这样在不同的平台可以同时实施不同传输需求下的协议。
RUDP 提供一组数据服务质量增强机制,如拥塞控制的改进、重发机制及淡化服务器算法等,从而在包丢失和网络拥塞的情况下, RTP 客户机(实时位置)面前呈现的就是一个高质量的 RTP 流。在不干扰协议的实时特性的同时,可靠 UDP 的拥塞控制机制允许 TCP 方式下的流控制行为。 
为了与网络 TCP 通信量同时工作, 
RUDP 使用类似于 TCP 的重发机制和拥塞控制算法。 
在最大化利用可用带宽上,这些算法都得到了很好的证明。 
RUDP特性 
客户机确认响应服务器发送给客户机的包; 
视窗和拥塞控制,服务器不能超出当前允许带宽; 
一旦发生包丢失,服务器重发给客户机; 
比实时流更快速,称为“缓存溢出”。 
用户数据报协议(UDP)

RTP(Real Time Protocol) 
RTP,实时协议被用来为应用程序如音频,视频等的实时数据的传输提供端到端(end to end)的网络传输功能。传输的模型可以是单点传送或是多点传送。数据传输被一个姐妹协议——实时控制协议(RTCP)来监控,后者允许在一个大的多点传送网络上监视数据传送,并且提供最小限度的控制和识别功能。
RTP是被IETF在RFC1889中提出来的。顺带提及,RTP已经被接受为实时多媒体传送的通用标准。ITU-T跟IETF都在各自的系统中将这一协议标准化。

1.1 为何需要RTP? 
TCP不能支持像交互视频,会议等的实时服务,这一原因是由于TCP只是一个“慢”协议,需要三次握手。就此在IP层上UDP是一个比TCP更好的选择。但是UDP是本质上是一个不可靠协议,不支持在包丢情况下的重传机制。诚然,UDP有一些特性,比如多路复用跟校验和服务,这些都是对实时服务很有利的。为了消除UDP的缺点,RTP是作为应用层而被提出来的。
RTP提供的各种服务包括有效负载识别,序列编号,时间戳和投递监听。RTP能够序列化包,当这些包在收端不是按顺序到达的时。序列号也能被用来识别包丢失。时间戳被用于媒体有效的播放。到达的数据一直被RTCP监听,以通知RTP层来校正其编码和传输的参数。例如,如果RTCP层检测到包丢失,它会通知RTP层减缓发送速率。
尽管RTP有助于实时媒体的有效的播放,但是要注意的是RTP自身并不提供任何机制来确保及时传递或提供其他服务质量(QoS)的保证,而是依靠低层服务来完成这些。同样,RTP也不保证投递或防止无序投递。RTP被设计出来主要是为了满足有多个参加者的多媒体会议的需要。RTP也同样适合于象持续数据的储存,分布式交互仿真,主动标记以及应用程序的控制和测量。

1.2 RTP特性一览 
RTP提供有效负荷类型识别,乱序重排和利用时间戳的媒体有效播放。 
RTCP监控服务质量,也提供在一个当前进行的会话中传送关于参加者的信息作用。 
RTP对于下层协议是独立的,它能够工作在像TCP/IP,ATM,帧时延等类型的网络上。 
如果被下层网络支持,RTP支持利用多路技术的对于多点的数据传输。 
RTP序列号也能被用来确定包的合适位置。例如在视频解码,包无需按序解码。

2.0 技术概览 
2.1 RTP 
RTP头具有如下的格式。开始的12个八位字节在每一个RTP包中都会出现;而CSRC标识符列表只在通过混合器的包中出现.

Version (V) (版本号):这个域长度为2比特,标出了RTP的最近版本。当前的版本为2.0 
Padding (P) (填充):这个域长度为1比特,如果P被置位,包在结尾处包含有一个或多个附加的填充字节,这些填充字节不是有效负荷的一部分。填充是一些需要固定块大小的加密算法所要求的,或是为了在低层PDU搬运RTP包。
Extension (X):这个域长度为1比特,如果被置位,固定的头后面紧跟了一个头的扩展。 
CSRC count (CC):这个域长度为4比特。这个域表示了跟在固定头后面的CSRC标识符的数目。如前所述,这个域只有在通过一个混合器才有非零值。 
Marker bit (M): 这个域长度为1比特,如果M被置位,表示一些重要的项目如帧边界在包中被标记。例如,如果包中有几个比特的当前帧,连同前一帧,那么RTP的这一位就被置位。
Payload type (PT) (有效负荷类型):这个域长度为7比特,PT指示的是有RTP包中的有效负荷的类型。RTP音频视频简介(AVP)包含了一个默认的有效负荷类型码到有效负荷格式的映射。附加的有效负荷类型可以向IANA注册。
Sequence number(序列号):这个域长度为16个比特,每送一个RTP包数目就增加一,初始值被设为一个随机数。接收方不仅可以用这个序列号检测包丢失,也可以重组包序列。
Time stamp(时间戳):这个域长度为32个比特,时间戳反映了RTP数据包的头一个字节的采样时刻。采样时刻必须是由一个单调线性增加的时钟产生,这样做是为了接收方的同步和抖动计算。初始值必须为随机数,这是为了避免对原码的攻击。例如,如果RTP源使用了一个编码器,缓冲20ms的音频数据,那么RTP时间戳必须每个包增加160,无论包是被传递了还是被丢失了。
SSRC:这个域长度为32比特,这个域表示了正在为会话产生RTP包的源。这个标识符是随机选中的,目的是为了避免同一个RTP会话中两个源有相同的标识符。 
CSRC list: 这个列表标识了在这个包中对有效负荷起作用的所有源。标识符的最大数目限定为15,这是由CC域所限定的(全零在CC域中是被禁止的)。如果有超过15个的分配源,只有前15个被标识。
仔细观察RTP可以注意到它不像更低层的协议比如PDU一样,包含一个“定边界”的域。这一原因是RTP的有效负荷是跟IP的有效负荷相同,因此也就不需要了。 
如果相同的用户在一个会话中使用多个媒体,比如说视频跟音频,每个媒体都会打开单独的RTP会话。因此在RTP层面上不存在多路复用。多路复用由更低层来决定。但是RTCP保留了一个叫CNAME的标识符,这个标识符对于由同一用户初始化的媒体是相同的。因此CNAME是在RTP层面上能识别从一个用户产生的不同媒体的唯一的标识符。

UDT(UDP-based Data Transfer Protocol) 
基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。 顾名思义,UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。 由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。

UDT是双工的,每个UDT实体有两个部分:发送和接收。发送者根据流量控制和速率控制来发送(和重传)应用程式数据。接收者接收数据包和控制包,并根据接收到的包发送控制包。发送和接收程式共享同一个UDP端口来发送和接收。
接收者也负责触发和处理任何的控制事件,包括拥塞控制和可靠性控制和他们的相对机制,例如RTT估计、带宽估计、应答和重传。 
UDT总是试着将应用层数据打包成固定的大小,除非数据不够这么大。和TCP相似的是,这个固定的包大小叫做MSS(最大包大小)。由于期望UDT用来传输大块数据流,我们假定只有很小的一部分不规则的大小的包在UDT session中。MSS能够通过应用程式来安装,MTU是其最优值(包括任何包头)。
UDT拥塞控制算法将速率控制和窗口(流量控制)合并起来,前者调整包的发送周期,后者限制最大的位被应答的包。在速率控制中使用的参数通过带宽估计技术来更新,他继承来自基于接收的包方法。同时,速率控制周期是估计RTT的常量,流控制参数依赖于对方的数据到达速度,另外接收端释放的缓冲区的大小。

UDP构建可靠数据传输 
简单来讲,要使用UDP来构建可靠的面向连接的数据传输,就要实现类似于TCP协议的超时重传,有序接受,应答确认,滑动窗口流量控制等机制,等于说要在传输层的上一层(或者直接在应用层)实现TCP协议的可靠数据传输机制,比如使用UDP数据包+序列号,UDP数据包+时间戳等方法,在服务器端进行应答确认机制,这样就会保证不可靠的UDP协议进行可靠的数据传输,不过这好像也是一个难题!

 

二十四.三次握手协议?

.

一、TCP报文格式

  TCP报文格式图:

 

  上图中有几个字段需要重点介绍下:

  (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

  (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

  (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:

  (A)URG:紧急指针(urgent pointer)有效。

  (B)ACK:确认序号有效。

  (C)PSH:接收方应该尽快将这个报文交给应用层。

  (D)RST:重置连接。

  (E)SYN:发起一个新连接。

  (F)FIN:释放一个连接。

 

 需要注意的是:

  (A)不要将确认序号Ack与标志位中的ACK搞混了。

  (B)确认方Ack=发起方Req+1,两端配对。 

 

二、三次握手

TCP(Transmission Control Protocol) 传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接

位码即tcp标志位,有6种标示:

 

SYN(synchronous建立联机)

ACK(acknowledgement 确认)

PSH(push传送)

FIN(finish结束)

RST(reset重置)

URG(urgent紧急)

 

Sequence number(顺序号码)

Acknowledge number(确认号码) 

establish  建立,创建

 

  所谓三次握手(Three-Way Handshake)即建立TCP连接,是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:



 

 

  (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

 

  (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack (number )=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态

 

  (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

 

 

  SYN攻击

  在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:

  #netstat -nap | grep SYN_RECV

  

 

三、四次挥手

 三次握手耳熟能详,四次挥手估计就..所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:



 

  由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

 (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

  (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

 (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

  (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。



 

 

  上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:



  

  流程和状态在上图中已经很明了了,在此不再赘述,可以参考前面的四次挥手解析步骤。

 

四、附注

  关于三次握手与四次挥手通常都会有典型的面试题,在此提出供有需求的XDJM们参考:

  (1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。

  (2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

 

  这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

二十五.有哪五类ip?

基本的IP地址是分成8位一个单元(称为8 位位组)的32位二进制数。二进制与十进制大家都懂吧。为了方便人们的使用,对机器友好的二进制地址转变为人们更熟悉的十进制地址。IP地址中的每一个8 位位组用0~255之间的一个十进制数表示。这些数之间用点(.)隔开,这是所谓的点-十进制格式。因此,最小的IPv4地址值为0.0.0.0,最大的地址值为255.255.255.255,然而这两个值是保留的,没有分配给私人的端系统。 
          点分十进制数表示的IPv4 地址分成几类,以适应大型、中型、小型的网络。这些类的不同之处在于用于表示网络的位数与用于表示主机的位数之间的差别。IP地址分成五类,用字母表示:
             A 类地址 
             B 类地址
             C 类地址 
             D 类地址 
             E 类地址 
         每一个IP地址包括两部分:网络地址和主机地址,上面五类地址对所支持的网络数和主机数有不同的组合。
           1. A 类地址
一个A 类IP地址仅使用第一个8位位组表示网络地址。剩下的3个8位位组表示主机地址。A类地址的第一个位总为0,这一点在数学上限制了A类地址的范围小于 127,127是64+32+16+8+4+2+1的和。最左边位表示128,在这里空缺。因此仅有127个可能的A类网络。A类地址后面的24位(3个点-十进制数)表示可能的主机地址,A类网络地址的范围从1.0.0.0到126.0.0.0。注意只有第一个8位位组表示网络地址,剩余的3个8位位组用于表示第一个8位位组所表示网络中惟一的主机地址,当用于描述网络时这些位置为0。注意技术上讲,127.0.0.0 也是一个A类地址,但是它已被保留作闭环(look back )测试之用而不能分配给一个网络。每一个A类地址能支持16777214个不同的主机地址,这个数是由2的24次方再减去2得到的。减2是必要的,因为 IP把全0保留为表示网络而全1表示网络内的广播地址。其中10.0.0.0 和10.255.255.255保留 
         2. B 类地址
设计B类地址的目的是支持中到大型的网络。B类网络地址范围从128.1.0.0到191.254.0.0。B 类地址蕴含的数学逻辑是相当简单的。一个B类IP地址使用两个8位位组表示网络号,另外两个8位位组表示主机号。B类地址的第1个8位位组的前两位总置为 10,剩下的6位既可以是0也可以是1,这样就限制其范围小于等于191,由128+32+16+8+4+2+1得到。最后的16位( 2个8位位组)标识可能的主机地址。每一个B类地址能支持64534 个惟一的主机地址,这个数由2的16次方减2得到。B类网络仅有16382个,其中172.16.0.0和172.31.255.255保留。
         3. C 类地址
C类地址用于支持大量的小型网络。这类地址可以认为与A类地址正好相反。A类地址使用第一个8位位组表示网络号,剩下的3个表示主机号,而C类地址使用三个8位位组表示网络地址,仅用一个8位位组表示主机号。C类地址的前3位数为110,前两位和为192(128+64),这形成了C类地址空间的下界。第三位等于十进制数32,这一位为0限制了地址空间的上界。不能使用第三位限制了此8位位组的最大值为255-32等于223。因此C类网络地址范围从 192.0.1.0 至223.255.254.0。最后一个8位位组用于主机寻址。每一个C类地址理论上可支持最大256个主机地址(0~255),但是仅有254个可用,因为0和255不是有效的主机地址。可以有2097150个不同的C类网络地址,其中192.168.0.0和192.168.255.255保留。
         4. D 类地址
D 类地址用于在IP网络中的组播( multicasting ,又称为多目广播)。D类地址的前4位恒为1110 ,预置前3位为1意味着D类地址开始于128+64+32等于224。第4位为0意味着D类地址的最大值为128+64+32+8+4+2+1为239,因此D类地址空间的范围从224.0.0.0到239. 255. 255.254。
         5. E 类地址
E 类地址保留作研究之用。因此Internet上没有可用的E类地址。E类地址的前4位恒为1,因此有效的地址范围从240.0.0.0 至255.255.255.255。
总的来说,ip地址分类由第一个八位组的值来确定。任何一个0到127 间的网络地址均是一个A类地址。任何一个128到191间的网络地址是一个B类地址。任何一个192到223 间的网络地址是一个C类地址。任何一个第一个八位组在224到239 间的网络地址是一个组播地址即D类地址。E类保留

 

二十六.谈谈飞秋这款软件的架构?

飞秋(FeiQ)是一款局域网聊天传送文件的绿色软件,它参考了飞鸽传书(IPMSG)和QQ, 完全兼容飞鸽传书(IPMSG)协议,具有局域网传送方便,速度快,操作简单的优点,同时具有QQ中的一些功能。

功能说明:- 飞秋的用法是一款局域网内即时通信软件, 基于 TCP/IP(UDP). - 完全兼容网上广为流传的飞鸽传书并比原来飞鸽传书功能更加强大.- 不需要服务器支持.- 支持文件/文件夹的传送 (支持大文件传送[4G以上]), 发送方和接收方都可查看传送进度功能.- 可以建立无需服务器的聊天室,具有群聊天室的功能.- 分组功能- 组权限功能,可能每组设置不同的权限,例如屏蔽该组成员的信息,对该组成员隐身等。

- 给所有在线的飞鸽传书用户群发消息及分组群发功能.- 黑名单功能- 隐身功能,及对某特定组进行隐身功能

-自定义备注名功能- 个性头像、个性形象及个性签名功能- 共享文件功能- 远程协助功能,让你轻松实现远程维护、远程展示、共享桌面等功能,即时远程沟通。

- 语音聊天功能,可以语音对话,轻松实现协同办公。

- 自定义表情功能、支持截屏、支持GIF动画- 随手涂鸭功能,能把您的创意想法得以很好的表达。

- 垃圾信息屏蔽功能- 用户上下线进行通知功能- 限制传送文件速度功能- 日程安排与记事功能- 日程提醒功能;它可以实现年、月、周、日、小时、分、秒的提醒,提醒同时可以执行动作(提示窗口、播放音乐、执行指定程序、关机等)。甚至每年的第几个月提醒、 第几月的星期几提醒等特殊的提醒。

 

二十七.端口号与IP、网关的作用?

ip(网络之间互连的协议):
网络之间互连的协议(IP)是Internet Protocol的外语缩写, 中文缩写为“网协”.
网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,
规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,
可以分为5类。另外,IP还有进入防护,知识产权,指针寄存器等含义。

端口:
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。
例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。
电话使用RJ11插口也属于物理端口的范畴。
端口号的范围从0到65535
网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。
网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,
甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求

你可能感兴趣的:(C语言,Linux,聊天室项目)