最近在看UNIX网络编程部分,再次缅怀一下 W.RICHARD STEVENS. 先生的去世是对计算机界的巨大损失。 留下的书籍堪称经典中的经典。站在巨人的肩膀上看世界。
《UNIX网络编程:卷1 · 套接口API》
第一章讲的是一些基本概念,首先给出了一个简单的时间获取客户程序。这本书的源代码,都可以在www.unpbook.com找到,当然,需要翻墙。你也可以百度,谷歌找到相应的源代码。其中阐述了OSI 模型,还有TCP/IP协议模型。这个没什么好讲的,先生还有《tcp/ip协议详解》三卷,这个值得去研究研究,其中的卷一应该是学习网络的经典书籍。
第二章讲的是TCP,UDP,SCTP,这三个协议。首先给出了一个TCP/IP协议的概貌图,其中包括IPV4 ,IPV6 ,TCP,UDP,SCTP,ICMP,IGMP,ARP,RARP,ICMPV6,BPF,DLPI。 其中术语双栈主机表示同时支持IP4 和IP6的主机。
接下来,详细介绍了UPD:用户数据报协议,该协议是不可靠的,无连接的服务。也不提供流量控制,只是简单的按发送端的速率发送数据,而不管接收端的缓冲区是否能够装得下。
TCP:传输控制协议,这是一个面向连接的,可靠的协议(这里的可靠是指提供可靠投递和故障的可靠通知,而不是100%可靠,这是不可能做到的),他有重传机制,有流量控制,TCP还通过给所发送数据的每一个字节关联一个序列号进行排序,这样接收端在接收数据的时候,可以重新排序或者处理那些重复(重传过来的)的数据。TCP还提供一种叫做RTT的算法,可以动态的估算服务器往返所花时间。
TCP连接的建立和终止
1.TCP通过三路握手建立一个连接。首先,服务器准备好接受连接,然后客户端调用connect进行主动连接,发送一个SYN(表示同步)分节给服务器,一般情况下SYN不携带数据,他只含有一个IP头部,TCP头部以及可能有的TCP选项。其次是,服务器确认客户的SYN,并发送自己的SYN和ACK(表示确认)。最后,客户确认服务器的SYN。
2.TCP通过四组交换来终止一个连接.
首先,某个应用进程调用close,(主动关闭),然后发送一个FIN分节,然后接收到FIN的另一端执行被动关闭,并且也把它作为一个文件结束符.一段时间后,接收到文件结束符的应用进程将调用close关闭他的套接口,这导致他也发送一个FIN回去,最后接收到这个FIN的原发送端,发送一个确认信号回去.在服务器端执行主动关闭和被动关闭之间,称为半关闭.通常是客户执行主动关闭,但有些例外,比如HTTP则是服务器执行主动关闭.
TCP的11个状态转换图.以及连接中的分组交换,这个就不多提了.不过看懂应该很重要.TCP的状态中有一个TIME_WAIT状态,这个据说有两个理由:一是可靠的实现TCP全双工连接的终止,二是允许老的重复字节在网络中消逝.
这里有一个MSL的概念(分节最长声明周期),TIME_WAIT的时间是2倍的MSL.
端口号:这里有一个套接口对的概念,一个套接口对是一个定义该连接的两个端点的四元组:本地IP地址,本地TCP端口号,远程IP地址,远程TCP端口号.
好吧,差不多就这些.