【Java TCP/IP Socket编程】----基础知识

1.计算机网络、分组报文和协议

计算机网络是一组通过通信信道相互连接的机器组成,这些机器被称为主机路由器。世界上所有的主机之间直接互联不可行,通过路由器可以将所有主机连接到一起,实现主机之间信息的传递,信息指代的是由程序创建和解释的字节序列(分组报文packet)。分组报文里面包含目的地址和用户等信息。怎么解析分组报文呢?

协议规定了分组报文的结构,比如分组报文中哪一段是目的地址或者端口等信息,是相互通信的程序之间的一种约定。其中TCP/IP协议族就是互联网使用协议,包含了IP协议(Internet Protocol)、TCP协议(Transimission Control Protocol)、UDP协议(User Datagram Protocol)。在TCP/IP四层模型中,IP协议是网络层(网络互联层)唯一的协议,实现的是将分组报文发送不同的主机。如下:IP协议实现了两个主机(Host)之间数据传送,而通过TCP/UDP协议建立在端口之上,实现了两个程序(Application)之间的通信。

                                                                                                                                                              

TCP/UDP协议是传输层的协议,建立在IP协议提供服务基础上,TCP/UDP协议使用的地址是端口号,实现了端到端的传输,即将数据从一个应用程序传输到另外一个应用程序。

  • TCP协议是面向连接的协议,提供了可靠的字节流信道,且能够检测和修复IP层提供的主机到主机的信道中可能存在的报文丢失,重复和其他错误。
  • UDP协议是无连接,不可靠的协议。不会对IP层出现错误进行修复,可能会出现丢失报文或者其他的错误的情况。

2.地址

在TCP/IP协议中,用两部分的信息来定位一个指定的程序:互联网地址(Internet address)和端口号(port number),其中互联网地址是由IP地址使用的,而附加的端口信息是由传输协议(TCP或者IP协议)来解析的。

互联网地址分为两类:IPv4(32位,40亿个独立地址)和IPv6(128位)。

  • IPv4地址是一组4个十进制数据,数字之间用圆点隔开,每个数字范围是0~255。例如: 10.1.2.3。
  • IPv6地址的16字节是由几组16进制数组表示,数字之间用分号隔开,每组数字分别表示了地址中两个字节,每组的开头0可省略,例如:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789。

1.回环地址:总是被分配个特殊的回环接口,回环接口是一种虚拟设备,功能是将发送给它的报文直接回发给发送者,IPv4的回环地址是127.0.0.1,IPv6的回环地址是0:0:0:0:0:0:0:1。

2.IPv4中保留了一些“私有用途”地址,包含以10或者192.168开头的地址,以及第一个数是172开头,第二个数是16~31的地址(IPv6中没有此类地址)。这些地址起初是私有网络设置的,不属于公共互联网的一部分,现在用于家庭或者小型办公室中,通过NAT(Network Address Translation,类似路由器)设置连接到互联网中。

3.相关类型的地址包含本地链接(link-local),称为“自动配置”地址,IPv4中此类地址是169.254开头,IPv6中,前16位又FE8开头的地址是本地链接地址。这类地址只能用来在连接到同一网络的主机之间通信,路由器不会转发。

4.多播(multicast)地址:IPv4中的多播地址第一个数字在224~239之间,IPv6中多播地址由FF开始。多播地址可能与任意数量的目的地址关联,普通的IP地址(“单播”地址)只与唯一一个目的地址相关联。

3.名字

互联网协议只能处理二进制的网络地址,而不是主机名(如baidu.com)。使用主机名而不是地址处于方便性考虑,使用名字来定位终端需要将名字解析成地址,名字解析服务主要通过域名系统(Domain Name System,DNS)和本地配置数据库完成。DNS是一种分布式数据库,它将www.mkp.com这样的域名映射到真实互联网地址和其他信息上,DNS协议允许连接到互联网的主机通过TCP或者UDP协议从DNS数据库中获取信息。本地配置数据库通常是一种与具体操作系统相关的机制,用来实现本地名称与互联网的映射。

4.客户端和服务器

客户端是通信的发起者,服务端程序则是被动等待客户端发起通信,并对其作出响应。客户端需要知道服务器的地址和端口号,反之不需要。

5.套接字

socket(套接字)是一种抽象层,应用程序通过它来发送和接收数据,使用socket可以将应用程序添加到网络中,并与处于同一个网络中的其他应用程序进行通信。一台计算机上的程序向socket写入的信息能够被另外一台计算机上的另一个应用程序读取,反之亦然。

不同类型的socket与不同类型的底层协议族以及同一个协议族中的不同协议栈相关联,TCP/IP协议族中主要socket类型为流套接字(stream socket)和数据报套接字(datagram socket),流套接字将TCP作为其端对端协议(底层使用IP协议),提供了一个可信赖的字节流服务。一个TCP/IP流套接字代表了TCP连接的一端。数据报套接字使用UDP协议(底层同样使用IP协议),提供了一个"尽力而为"(best-effort)的数据报服务,应用程序可以通过它发送最长65500字节的个人信息。一个TCP/IP套接字由一个互联网地址,一个端对端协议(TCP或UDP协议)以及一个端口号唯一确定。

如下:TCP/UDP套接字可以被多个应用程序引用,使用了指定的套接字的程序是通过此套接字进行通信。一个端口标识了一台主机上的一个应用程序,一个端口确定了一台主机上的套接字。这表明一个主机上多个程序可以同时访问一个套接字,这些程序是属于同一个应用(比如:web服务程序的多个副本),但理论上是属于不同的应用的。

                                         

猜你喜欢

转载自blog.csdn.net/lili13897741554/article/details/82980979