数据在Internet中是以有限大小的包形式传输的,这些包称为数据报(datagram)。每个数据报都包含一个首部(header)和一个有效负载(payload)。
首部:
首部包含包去往的地址和端口、包来自的地址和端口以及用于保证可靠传输的各种其他管理信息。
有效负载:包含数据本身。
但是由于数据报长度有限,通常必须将数据分解为多个包,在目的地再重新组合。也有可能一个包或者多个包会在传输中丢失或遭到破坏,需要重传;或者包乱序到达,需要重新排序。记录这些事情(将数据报分解为包、生成首部、解析入站包的首部、记住哪些包是否收到等等)是很繁重的工作,需要大量代码,不过,你不需要自己来完成,Socket将网络连接视为另一种可以读取自己的流。Socket对程序掩盖网络底层细节,如纠错、包大小、包重传、网络地址等。
socket
socket是两台主机之间的一个连接。它可以进行如下七种基本操作:
1.连接远程连接
2.发送数据
3.接收数据
4.关闭连接
5.绑定端口
6.监听入站数据
7.在所绑定端口上接受来自远程机器的连接
java socket类可同时用于客户端和服务器,它有对应于前四项操作的方法。后三项操作只有服务器才需要,即等待客户端的连接,这些通过ServerSocket类实现。
用telnet研究协议:
为了了解协议如何操作,可以使用Telnet连接到一台服务器,键入不同的命令观察它的响应。
这些命令是协议定义的命令。
如果你知道与SMTP服务器的交换命令,可以不通过邮件程序就能发送电子邮件。
在集群中,每个节点都会监听一个端口,因此,通过在与该节点可以通信的其他机器上(一般线下是不能直接telnet 线上的节点的,都是通过relay)中进行telnet ip port 来判定该节点的存活状态。
如果我们能够telnet到redis服务器,那么我们就能执行redis协议的命令,进行操作的。
举个例子:我本地启动了Elasticsearch,这个应用程序监听的端口是9300,我再本地telnet该端口,然后随便输入,然后会看到Elasticsearch会报错,这就是没有按照elasticsearch的协议(或者说规范)下命令造成的。
参考《Java网络编程》