分组报文,协议和Socket的概念
这篇随笔是我接着上篇《字节和字符,对信息进行编码》继续写的内容,看过上篇随笔能更好的理解这篇内容。我想从基础的开始说起,一直说到Asp.net,WCF为止。
信息是指由程序创建和建设的“字节序列”。在网络环境中,这些字节序列被称作“分组报文”。一组报文包括了网络用来完成工作的控制信息,还包括了数据信息。
协议相当于互相通信的程序(进程间通信)间达成的一种约定,它规定了分组报文的交换方式和它们包含的含义。一组协议规定了以下信息:
1.结构。 比如报文中哪一部分表明了其目的地址。
2.解析。如何对报文中所包含的信息进行解析。
设计一组协议,通常是为了在一定约束条件下解决某一特定问题。比如,超文本传输协议http是为了解决在服务期间传递超文本对象的问题。
网络层:
网络层完成将分组报文传输到它们的目的地址的工作。注意,目的地只精确到网络接口(port to port),并不精确到应用程序。IP属于网络层。
网络层完成将分组报文传输到它们的目的地址的工作。注意,目的地只精确到网络接口(port to port),并不精确到应用程序。IP属于网络层。
IP协议传输的数据单位是数据报(Datagram),数据报的首部(一般20个字节)包含有源和目标的IP地址以及其他的相应的寻址和控制信息。IP协议具有以下两个显著的特点:
- 不可靠(Unreliable): IP协议只能尽可能提供最好的传输服务,但不能保证数据报能够成功地抵达目的地。如果发生某种错误,它有一个简单的错误处理算法:丢弃数据报,然后发送通知信息给发送端;
- 无连接(Connectionless):IP协议并不维护任何关于后续数据报的状态信息,每一个数据报都是被独立处理的。
传输层:
TCP 协议和IP协议都有一个共同的功能,即寻址。回顾一下,IP协议只是将分组报文分发到了不同主机(更准确的说是网络接口,因为一台主机可能装了多个网卡, 而网卡才是目的地。cpu,主板等其他组成一台主机的其他组成部分并不是目的地)。很明显,还需要其他更细粒度的寻址将报文发送到主机中指定的应用程序, 因为同一台主机上可能有多个应用程序在使用网络。TCP协议和UDP协议使用的地址叫做“端口号",这就是用来区分同一台主机中不同应用程序的。TCP和 UDP协议有时候也称作端到端传输协议(end-to-end transport protocol),因为它们将数据"从一个应用程序传输到另一个应用程序",而IP协议只是将数据从”一台主机传输到另一台主机"
TCP 协议和IP协议都有一个共同的功能,即寻址。回顾一下,IP协议只是将分组报文分发到了不同主机(更准确的说是网络接口,因为一台主机可能装了多个网卡, 而网卡才是目的地。cpu,主板等其他组成一台主机的其他组成部分并不是目的地)。很明显,还需要其他更细粒度的寻址将报文发送到主机中指定的应用程序, 因为同一台主机上可能有多个应用程序在使用网络。TCP协议和UDP协议使用的地址叫做“端口号",这就是用来区分同一台主机中不同应用程序的。TCP和 UDP协议有时候也称作端到端传输协议(end-to-end transport protocol),因为它们将数据"从一个应用程序传输到另一个应用程序",而IP协议只是将数据从”一台主机传输到另一台主机"
TCP
协议能够检测和恢复IP层提供的主机到主机的信道中可能发生的报文丢失,重复以及其他错误。TCP协议提供了一个可信赖的字节流(reilable
byte-stream)信道。(注意流的概念,下面在提到NIO的时候会和buffer进行比较).使用TCP协议在很多方面都与文件的输入输出
(I/O)相似。实际上,由一个程序写入的文件再由另一个程序读取就是一个TCP连接的适当模型。
- 消息确认(Message Acknowledgement):当接收端TCP成功接收到TCP报文段之后,会在一个短暂的时间间隔内(并不是在成功接收到报文的那一刻),向发送端发送一个表明该报文段已经被成功接收确认消息(Acknowledgement);
- 超时重传:发 送端具有一个存储报文段的缓冲区(Buffer),我们一般称为发送端窗口(Sender Window),用于存放已经发送但是尚未接受到确认的报文段。如果接收到确认,会将相应的报文段从发送端窗口中移除。如果在一定的超时时限内没有接收到 确认消息,会认为相应的报文段发送失败,此时发送端TCP会从发送端窗口中提取相应的报文段进行重新发送。
UDP协议并不尝试对IP层产生的错误进行修复,它仅仅简单的扩展了IP协议“尽力而为best effort"的数据报服务,使得数据能在应用程序之间工作,而不是在主机之间工作。因此,使用了UDP协议的应用程序必须为处理报文丢失,顺序混乱等问题做好准备。
下面来谈下Socket。
Socket:只是一个抽象层。用来表示程序已经加入到网络中。
这句话的意思就是一旦一个程序中有了一个Socket实例对象,那么这个程序就被加入到了网络当中,可以和网络中的其他应用程序进行通信。
现在来关注Socket是抽象层这段话。既然Socket是抽象的,那么它肯定有很多不同具体的实现,比如说以TCP为基础的TCPSocekt和以UDP为基础的UDPSocket。
"不恰当的比方来说,拥有一个Sokcet就像狱警对犯人说你有和外界沟通的
权力。和外界沟通这个概念是抽象的,具体是坐在桌子前面谈,还是通过电话机隔着玻璃窗谈话,(请想象美剧中的场景)还是允许写信,单从“你可以和外界沟通
“这句话来说都是不可知的。我们唯一能知道的是,我们可以和外界沟通了。"
接下来的随笔中我会继续说明这几种实现方式的异同点。