一.网络的分层
有两套参考模型:
- OSI参考模型(Open Systems Interconnection Reference Model,七层):模型过于理想化,未能在因特网上进行广泛推广。
- TCP/IP参考模型(或TCP/IP协议,四层):事实上的国际标准。
在不同层数据如何封装和拆分:
90%的情况下Java代码都将在应用层工作,只需要与传输层对话。其它10%的时间会在传输层处理,与应用层或网际层对话。
网际层(internet layer)
在OSI模型中,网际层使用了一个更一般的名字,称为网络层(network layer)。网络层协议定义了数据位和字节如何组织为更大的分组,称为包,还定义了寻址机制,不同的计算机要按照这个寻址机制查找对方。网际协议(IP)是世界上使用最广发的网络层协议,也是Java唯一理解的网络层协议。实际上,这是两个协议:IPv4 和 IPv6。在 IPv4 和 IPv6 中,数据按包在网际层上传输,这些包称为数据报(datagram)。
除了路由和寻址,网际层的第二个作用是支持不同类型的主机网络层相互对话。Internet 路由器会完成 WiFi 和 Ethernet、Ehernet 和 DSL、DSL 和光纤往返等协议之间的转换。如果没有网际层或类似的分层,则每个计算机只能与同一类网络上的其它计算机对话。网际层负责使用同构协议将异构网络相互连接。
传输层
原始数据报有一些缺点。最显著的缺点是不能保证可靠传送,即使能传送也可能在传输中遭到破坏。首部校验和只能检测首部中的破坏情况,而不能检测数据报中的数据部分。最后,即使数据报能到达目的地而未被破坏,也不一定会以发送时的顺序到达。各个数据报可能会经过不同路由从源地到达目的地。如果数据报A在数据报B之前发送,这并不意味着数据报A会在数据报B之前到达。
传输层(transport layer)负责确保各包已发送的顺序接收,并保证没有数据对视或破坏。如果丢包,传输层会请求发送方重换这个包。为实现这个目标,IP网络会给每个数据报添加一个附加首部,其中包含有更多信息。这一层上主要有两个协议。第一个是传输控制协议(Transmission Control Protocol,TCP),这是一个开销很高的协议,支持对丢失或破坏的数据进行重换,并按照发送时的顺序进行传送。第二个协议是用户数据报协议(User Datagram Protocol,UDP),它允许接收方检测被破坏的包,但不保证这些包以正确的顺序传送(或者包有可能根本未传送)。但是 UDP 通常比TCP 快。TCP称为可靠的(reliable)协议;UDP 是不可靠的(unreliable)协议。后面我们将看到,不可靠的协议要比听起来有用得多。
应用层
向用户传送数据的层称为应用层(application layer)。它下面的三层定义了数据如何从一台计算机传输到另一台计算机。应用层确定了数据传输后的操作。例如,应用层协议如 HTTP(用于国际互联网)可以确保 Web 浏览器将图像显示为图片,而不是一长串数据。你的程序中的有关网络的部分大多都是在应用层花费时间。除了用户 Web 的 HTTP ,还有用于电子邮件的 SMTP ,POP ,IMAP;用于文件传输的 FTP、FSP 和 TFTP;用于文件访问的 NFS;用于文件共享的 Gnutella 和 BitTorrent;用于语音通信的会话启动协议(Session Initiation Protocol, SIP)和 Skype 等。此外,你的程序可以在必要时自定义自己的应用层协议。
二.IP和端口
IP 地址:InetAddress
- 唯一的标识Internet 上的计算机
- 本地回环地址(hostAddress):127.0.0.1 主机名(hostName): localhost
- 不易记忆
端口号:标识正在计算机上运行的进程(程序)
- 不同的进程有不同的端口号
- 被规定为一个16 位的整数0~65535。其中,0~1023被预先定义的服务通信占用(如MySql占用端口3306,http占用端口80等)。 除非我们需要访问这些特定服务,否则,就应该使用1024~65535 这些端口中的某一个进行通信,以免发生端口冲突。
端口号与IP地址的组合得出一个网络套接字。例如QQ通信,通过IP地址和端口号才能准确地定位两个QQ客户端。
三.TCP、UDP和Socket
网络通信协议:计算机网络中实现通信必须有一些约定,即通信协议, 对速率、传输代码、代码结构、传输控制步骤、出错控制 等制定标准。
通信协议分层的思想:
由于结点之间联系很复杂,在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用 下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。
1.TCP/UDP 协议
传输层协议中有两个非常重要的协议:
- 传输控制协议TCP(Transmission Control Protocol)
- 用户数据报协议UDP(User Datagram Protocol)。
1.TCP协议:
- 使用TCP协议前,须先建立TCP连接,形成传输数据通道
- 传输前,采用“三次握手”方式,是可靠的
- TCP协议进行通信的两个应用进程:客户端、服务端
- 在连接中可进行大数据量的传输
- 传输完毕,需释放已建立的连接,效率低
2.UDP协议:
- 将数据、源、目的封装成数据包,不需要建立连接
- 每个数据报的大小限制在64K内
- 因无需连接,故是不可靠的
- 发送数据结束时无需释放资源,速度快
2.Socket
- 利用套接字(Socket)开发网络应用程序早已被广泛的采用, 以至于成为事实上的标准。
- 通信的两端都要有Socket,是两台机器间通信的端点网络通信其实就是Socket间的通信。
- Socket允许程序把网络连接当成一个流,数据在两个Socket 间通过IO传输。
- 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。