网络编程的基本模型就是客户机到服务器模型.简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系..然后完成数据的通讯就可以了.这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端.基于这个简单的模型,就可以进入网络编程啦.
Java对这个模型的支持有很多种Api.而这里我只想介绍有关Socket的编程接口.对于Java而言已经简化了Socket的编程接口.首先我们来讨论有关提供固定位置的服务方是如何建立的.Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你.ServerSocket server=new ServerSocket(67);这里稍微要注意的是端口的分配必须是唯一的.因为端口是为了唯一标识每台计算机唯一服务的.另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的.好了.我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求.因此Java同样提供了一个Socket对象来对其进行支持.只要客户方创建一个Socket的实例对象进行支持就可以了.Socket client
=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的IP地址.对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供.它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法.
好了.上面的方法基本可以建立一条连线让两台计算机相互交流了.可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的.因为底层的网络是继续数据的.除非远程调用,处理问题的核心在执行上.否则数据的交互还是依赖于IO操作的.所以你也必须导入java.io这个包.java的IO操作也不复杂.它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写.
BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
PrintWriter out=new PrintWriter(server.getOutputStream());
上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作.而原始的字节流来源于Socket的两个方法.getInputStream()和getOutputStream()方.分别用来得到输入和输出.那么现在有了基本的模型和基本的操作工具.我们可以做一个简单的Socket例程了.
报文是计算机网络传输数据最高的单位,可以说我们电脑与电脑传输的数据就是报文 报文
报文是网络中交换与传输的数据单元。报文包含了将要发送的完整的数据信息,其长短很不一致。(可分为自由报文和数字报文)
报文也是网络传输的单位,传输过程中会不断的封装成分组、包、帧来传输,封装的方式就是添加一些信息段,那些就是报文头
以一定格式组织起来的数据.
比如里面有报文类型, 报文版本, 报文长度, 报文实体等等信息.
完全与系统定义, 或自定义的数据结构同义. 来几个 TCP/IP 头结构感受一下:
typedef struct _iphdr //定义IP首部 {
unsigned char h_lenver; //4位首度+4位IP版本号 unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节) unsigned short ident; //16位标识
unsigned short frag_and_flags; //3位标志位 unsigned char ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他) unsigned short checksum; //16位IP首部校验和 unsigned int sourceIP; //32位源IP地址 unsigned int destIP; //32位目的IP地址 }IP_HEADER;
typedef struct psd_hdr //定义TCP伪首部 {
unsigned long saddr; //源地址 unsigned long daddr; //目的地址 char mbz;
char ptcl; //协议类型
unsigned short tcpl; //TCP长度
}PSD_HEADER;
typedef struct _tcphdr //定义TCP首部 {
USHORT th_sport; //16位源端口 USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号 unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首度/6位保留字 unsigned char th_flag; //6位标志位 USHORT th_win; //16位窗口大小 USHORT th_sum; //16位校验和 USHORT th_urp; //16位紧急数据偏移量
}TCP_HEADER;
// 这里只是数据头, 但头最能让你看清报文是啥东东
// IP_HEADER::total_len 指明了实体数据(也就是真正的消息内容)长度. // 其他以此类推 1 UDP报文:
UDP报文比较简单,由四个字段组成,每个字段2个字节: (1) 源端口 source port (2) 目的端口 destination port (3) 长度 :UDP用户数据报的长度 (4) 检验和 checksum 2 TCP报文:
TCP首部比较复杂,分为两大部分,前20个字节是大小固定的,后面的选项部分大小不固定。
首部固定部分各段意义: (1) 源端口 source port 2个字节 (2) 目的端口 destination port 2个字节
(3) 序号:sequence number,TCP传送的是面向连接的连续的数据流,所传送的数据每一个字节都编上一个序号,首部的这个序号指的是本报文段所发送的数据的第一个字节的序号,占4个字节
(4) 确认号:Ack number,是期望受到对方的下一个报文段的数据的第一个字节的序号,也就是期望收到的下一个报文段首部的序号字段的值,占4个字节
(5)数据偏移:占4位,(单位是4字节),类似于IP包头的首度,他是指TCP报文段首部的长度,由于存在长度不确定的选项字段,所以此值最小为20字节,最大为60字节 (6)保留:6bit,目前没用,设为0
(7)这里的6位是说明本报文段性质的,下面再详细说 (8)窗口:window,占2个字节,用来控制对方发送的数量 (9)检验和:checksum,2个字节,检验范围为首部加数据两部分 下面看看那6位的控制部分各位的含义:
SYN:该标志位用来建立连接,让连接双方同步序列号. FIN:表示发送端已经没有数据要求传输了,希望释放连接.
RST:用来复位一个连接.RST标志置位的数据包称为复位包.一般情况下,如果TCP收到的一个分段明显不是属于该主机上的任何一个连接,则向远程发送一个复位包.
URG:为紧急数据标志.如果他为1,表示本数据包中包含紧急数据.此时紧急数据指针有效.
ACK:为确认标志位.如果为1,表示包中的确认号时有效的.否则,包中的确认号无效. PSH:如果置位,接收端应尽快把数据传诵给应用层.
TCP/IP其实是两个网络基础协议:IP协议、TCP协议名称的组合。
IP(Internet Protocol)协议的英文名直译就是:因特网协议。从这个名称我们就可以知道IP协议的重要性。在现实生活中,我们进行货物运输时都是把货物包装成一个个的纸箱或者是集装箱之后才进行运输,在网络世界中各种信息也是通过类似的方式进行传输的。IP协议规定了数据传输时的基本单元和格式。如果比作货物运输,IP协议规定了货物打包时
的包装箱尺寸和包装的程序。 除了这些以外,IP协议还定义了数据包的递交办法和路由选择。同样用货物运输做比喻,IP协议规定了货物的运输方法和运输路线。 TCP协议
我们已经知道了IP协议很重要,IP协议已经规定了数据传输的主要内容,那TCP(Transmission Control Protocol)协议是做什么的呢?不知大家发现没有,在IP协议中定义的传输是单向的,也就是说发出去的货物对方有没有收到我们是不知道的。就好像8毛钱一份的平信一样。那对于重要的信件我们要寄挂号信怎么办呢?TCP协议就是帮我们寄“挂号信”的。TCP协议提供了可靠的面向对象的数据流传输服务的规则和约定。简单的说在TCP模式中,对方发一个数据包给你,你要发一个确认数据包给对方。通过这种确认来提供可靠性。
TCP/IP(Transmission Control Protocol/Internet Protocol的简写,中文译名为传输控制协议/互联网络协议)协议是Internet最基本的协议,简单地说,就是由底层的IP协议和TCP协议组成的。TCP/IP协议的开发工作始于70年代,是用于互联网的第一套协议。