C++中返回指向函数的指针学习

// --------------------------------1.常用协议简介--------------------------------------------
IPv4  (网际协议版本4) 使用32位地址, 给TCP,UDP,SCTP,ICMP和IGMP提供分组递送服务
IPv6  (网际协议版本6) 使用128地址,  给TCP,UDP,SCTP和 ICMPv6 提供分组递送服务。
TCP   (传输控制协议),面向连接的协议,为用户进程提供可靠的全双工字节流。TCP套接字是一种流套接(stream socket )。TCP既可以去使用IPv4也可以使用IPv6
UDP   (用户数据包协议), UDP是一种无连接协议。UDP套接字是一种数据报套接字(datagram socket)。
SCTP  (流控制传输协议),SCTP是一个提供可靠全双工关联的面向连接的协议。
ICMP  ( 网际控制消息协议),ICMP处理在路由器和主机之间流通的错误和控制消息。这些消息通常由TCP/IP网络支持软件本身(而不是用户进程)产生和处理,不过ping和traceroute程序同样使用ICMP。
IGMP  (网际组管理协议) IGMP用于多播。
ARP   (地址解析协议)ARP把一个IPv4地址映射成硬件地址,如以太网地址。
RARP  (反向地址解析协议)ARP把一个硬件地址映射成IPv4地址。

//-------------------------------- 2.UDP 协议的一些细节--------------------------------------
每个UDP数据报都有一个长度。如果一个数据报正确地到达目的地,那么该数据报的长度将随数据一道传递给接收端应用进程。这一点不同于TCP这个字节流协议,没有任何记录边界。(但是IP的首部有长度字段)

UDP提供无连接的服务,因为UDP客户与服务器之间不必存在任何长期的关系。


// --------------------------------3.TCP 协议的一些细节--------------------------------------
TCP不仅提供客户与服务器之间的连接,还提供了可靠性,因为当TCP向对端发送数据时,它要求对端返回一个确认,如果没收到确认,TCP就自动重传数据并等待更长时间,在数次重传失败后,TCP才放弃。 
但也不能被描述成100%可靠的协议,它提供的是数据的可靠递送或故障的可靠通知。TCP要么尽力把数据递送到对方端点,否则就通过放弃重传并中断连接来通知用户。

TCP含有用于动态估算客户与服务器之间的往返时间(RTT,round-trip time)的算法,以便它知道等待一个确认需要多少时间。因为RTT受网络流通各种变化因素影响,TCP还持续估算一个给定连接的RTT。

TCP含有序列号机制,通过给其中每个分节关联一个序列号对所发送的数据进行排序。如果这些分节非顺序到达,接收端TCP将先根据它们的序列号重新排序,如果接收端TCP接收到来自对端的重复数据,它可以根据序列号判定数据是重复的,从而丢弃重复数据。

TCP提供流量控制,TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通告窗口,该窗口指出接收缓冲区中当前可用的空间量,确保发送端发送的数据不会使接收缓冲区溢出。
TCP连接是全双工的,这意味着在一个给定的连接上应用可以在任何时刻在进出两个方向上既发送数据又接收数据。因此,TCP必须为每个数据流方向跟踪诸如序列号和通告窗口大小等状态信息。

// -----------------------------------4.SCTP 协议的一些细节--------------------------------------
SCTP在客户和服务器之间提供关联(association),并像TCP那样给应用提供可靠性,排序,流量控制以及全双工的数据传送。
与TCP不同的是它不是面向流的,而是面向消息的,它提供各个记录的按序递送服务,与UDP一样,由发送端写入的每条记录长度随数据一道传递给接收端应用。
SCTP提供所连接的端点之间多个流,每个流各自可靠地按序递送消息,一个流上某个消息的丢失不会阻塞同一关联其他流上的投递。这种做法与TCP相反,就TCP而言,在单一字节流中任何
位置字节丢失都将该连接上其后所有数据的递送,直到该丢失被修复为止。
SCTP还提供多宿的特性,使得单个SCTP端点能够支持多个IP地址,如果它的某个网络或某个跨越因特网的通路发生故障,SCTP就可以通过切换到使用已与该关联相关的另一个地址
来规避所发生的故障。

// ----------------------------------5.三路握手---------------------------------------
第一步:服务器被动打开(passive open)。
第二步:客户端发起主动打开(active open)。这导致客户TCP发送一个SYN分节,它告诉服务器客户端将在(待建立的)连接中发送的数据初始序列号。
第三步:服务器确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的初始数据序列号。注意,服务器在单个分节中发送SYN和对客户SYN的ACK。
第四步:客户必须确认服务器的SYN
因为这种交换一般需要(至少)3个分组,因此称之为TCP的三路握手(three-way handshake)。

ACK中的确认号是发送这个ACK的一端所期待接收的下一个序列号、(有点拗口,但是想想的确如此,下一次发送SYN的那端将以这个ACK中的确认号作为序列号)

//------------------------------------6.TCP选项--------------------------------------
每个SYN可以含有多个TCP选项
1.MSS选项,发送SYN的TCP一端使用本选项通告对端它的最大分节大小(maximum segment size)即MSS,也就是它在比呢连接的每个TCP分节中愿意接受的最大数据量。发送端TCP使用接收端
的MSS值作为所发送分节的最大大小。可以使用TCP_MAXSEG套接字选项提取和设置这个TCP选项。
2.窗口规模选项,TCP连接任何一端能够通告对端的最大窗口大小是65535,因为在TCP首部中相应的字段占16位,然而在当今因特网上越来越普及高速网络连接或长延迟路径要求有
更大的窗口以获得尽可能大的吞吐量。这个新选项指定TCP首部中的通告窗口必须扩大(即左移)的位数。在一个TCP连接上使用窗口规模的前提是它的两个端系统必须都支持这个选项。可以使用SO
_RECVBUF套接字选项影响这个TCP选项。
3.时间戳选项,对于高速网络连接是必要的,防止由失而复现的分组(由暂时的路由原因造成的迷途的分组,当路由稳定后,它又会正常到达目的地,其前提是他它们在此前尚未被路由器
丢弃)因为高速网络中32位序列号短时间内就可能循环一轮重新使用,若不使用时间戳选项,失而复现的分组所承载的分节可能与再次使用相同序列号的真正分节发生混淆)造成数据破坏。

//----------------------------------7.TCP连接终止-------------------------------------
第一步:某个应用进程首先调用close,即该端执行主动关闭(active close),该端的TCP于是会发送一个FIN分节,表示数据发送完毕。
第二步:接收到这个FIN的对端执行被动关闭(passive close),这个FIN由对端的TCP确认,它的接收也作为一个文件结束符传递给接收端应用进程(放在已排队等候该应用进程接收
的任何其他数据之后),因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可以接收。
第三步:一段时间后,接收到这个文件结束符的应用进程调用close关闭它的套接字,这导致它的TCP也发送一个FIN。
第四步:主动关闭的那端的TCP确认这个FIN。

要知道的是,当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的序号)终止时,所有打开的描述符都被关闭,这也导致任然打开的任何TCP
连接也发出一个FIN。
通常情况下客户端执行关闭,但是某些协议如HTTP/1.0 却由服务器执行主动关闭。


C++中返回指向函数的指针学习,布布扣,bubuko.com

C++中返回指向函数的指针学习

上一篇:MySQL数据管理


下一篇:写Java也得了解CPU--CPU缓存