wordpress多站点批量添加,wordpress文章批量,手表二级市场网站,珠海公众号开发网络分层
主机网络层–数据链路层
主机网络层定义了一个特定的网络接口比如网卡或者wifi天线#xff0c;如果通过物理连接向本地网络或者世界其他地方发送IP数据报。主机网络层中有链接不同计算机的硬件#xff08;电缆#xff0c;光纤#xff0c;无线电波等#xff09;…网络分层
主机网络层–数据链路层
主机网络层定义了一个特定的网络接口比如网卡或者wifi天线如果通过物理连接向本地网络或者世界其他地方发送IP数据报。主机网络层中有链接不同计算机的硬件电缆光纤无线电波等自测的部分称为网络物理层。
网络层
网络层现已定义了数据位和字节如何组织为更大的分组称为包还定义了寻址机制不同计算机按照这个寻址机制查找对方。其中运用的最广的协议是网际协议IP路由寻址功能IP指两个协议IPV4和IPV6IPV4采用32位地址IPV6使用128位地址另外还增加一些技术特性来帮助完成路由功能在两个协议中数据包在网际层传输这些包称为数据报每个IPV4数据报包含一个长度为20~60字节的首部已经一个包含最多65515字节数据的有效荷载实际可以比这个小IPV6则更大最多可以6G。作用二支持不同类型的网络层相互对话比如理由起完成WIFI和EthernetEthernet和DSL DSL和光纤往返鞥协议之间的转换
传输层
因为原始数据报文无法保证可靠的并且顺序的从源头到目的地所有需要传输层来保证各个报文以发送的顺序结束并且保证数据的完整性没有丢失和破坏。如果丢包会请求重发实现这个的是在每个报文通讯协议TCP传输控制协议支持对丢失破坏的数据进行重传UDP用户数据报协议允许接受方检测到破坏的包但是不保证包的传输顺序或者根本没有送达。UDP比TCP快TCP比UDP更可靠
应用层
向用户传输数据的层称为引用层他下面的三层共同定义了数据如何从一台计算机传输到另外一台计算机。应用层确认了数据传输之后的操作比如各种HTTP用户web浏览器例如图片显示不会显示为一片数字还有用于邮件的SMTPPOPIMAP用于文本传输的FTPFSPTFTP用于文件的NFS等。 IPTCP和UDP
IP
理论上每台计算机都有一个4字节的数字IPV4标识一般写成点分四段格式比如192.168.1.1每个数字都是一个无符号字节范围是0~255所有理论上IPV4能表达的不同个数为255^4 大约42亿但并不按人口分配所有有的地区亚洲欧洲已经不够用所有出现IPV6IPV6使用16字节地址用冒号分割的8个区块每个区块四个十六进制数字。比如2001:0db8:85a3:08d3:1319:8a2e:0370:7344这样就有足够多的IP来标识每台计算机DNS设计是用来将域名替换IP更加方便人类的记忆以及使用单访问一个域名www.zhenai.com的时候DNS会将域名解析成对应的Internet地址比如192.168.1.1所有单我们用java范文网络需要同时处理数字地址和对应主机名java.net.InetAddress类中提供。端口计算机由IP来区分但是一台计算机可能同时需要做N件事所有我们用端口port来实现区分。每台有IP地址的计算机由好几千个逻辑端口每个传输层协议有65535个端口。这些只是内存中的抽象不表示任何物理实物和USB等端口不一样每个端口有1~65535之间的数字表示。
Internet地址分块
IP由ISP(Internet服务提供商)分配当公司需要组件一个基于IP的网络连接到Internet时候ISP会给他们分配地址快每个地址块有固定前缀
网络地址转换
因为现在IPV4越来越少所以现在大多数网络都使用了网络地址转换NAT大多数节点都是本地地址这些地址在使用链接ISP的时候会通过NAT转换成可路由的IP比如局域网我们看到的最多的是192.168.1.X这个其实是我们你内网的一个IP是不可以对外路由的当需要发送消息出去我们通过路由器会将这个地址修改外网地址216.254.85.72当需要接收时候则将接受地址修改为我们的192.168.1.X。不过如果使用IPV6这些就都没有意义了包括NAT因为IPV6 足够多大可每台机器一个
防火墙
位于Internet和本地网络之间的一些硬件和软件会检测所有进出的数据用来保证他的合法性这就是防火墙具体的检测方式各个网络要求不同则实现不同。
代理服务器
代理服务器和防火墙有关如果防火墙阻止范文代理服务器可以起到中间人的作用我们请求代理服务器由代理服务器去请求我们需要的web服务器页面然后将相应转发给我这样就可以跳过防火墙。优势在于这样访问外部的主机只能看到代理服务器并不知道真正请求的IP
DNS
每个打的局域网都有一个DNS域名服务器比如公司分配的局域网中的DNS只知道本地网络上的主机如果需要访问局域网以外的地址本地域名服务器会访问远程域名服务器然后将结果转发给请求者。缓存由于DNS的开销可能相当大比如频繁范文不可达的主机可能需要几秒钟所以InetAddress类会缓存查询的解决下次查询直接读缓存这样弊端在于如果域名变化这种极端情况会再一定时间内改域名不可访问。
URI
统一资源标识符Iniform Resource IdentifierURI是采用一种特定预发标识一个资源的字符串。所标识的资源可能是文件也可能是邮寄地址新闻消息图书等内容。
URL
URL是一个URI除了标识一个资源还会为资源提供一个特定的网络位置客户端可以用它来获取这个资源的一个表示。与之不同的URI可以表示的信息是这个资源是什么但是无法告诉你资源位置已经如何得到这个资源。比如书名《哈利波特》和“A图书馆B层C书架D位置”之间的区别前者只是书名字后者是该书本的位置URL中指定位置包括范问协议FTPHTTP服务器主机域名文件在该服务器路径比如https://www.tapd.cn/20085821/prong/stories/view/1120085821001011775
从URL获取数据
java.net.URL类中有几个方法可以从URL获取到数据
public final InputStream openStream() throws java.io.IOException
public URLConnection openConnection(Proxy proxy)throws java.io.IOException
public final InputStream openStream() throws java.io.IOException
public final Object getContent() throws java.io.IOException
public final Object getContent(Class[] classes)throws java.io.IOException分解URL
URL由五步法组成协议授权机构路径片段标识查询字符串例如http://oa.zhenai.com/append/itapply/toITApplyTencentCtlApply.do?processInfoId105#123其中模式Http 授权机构是oa.zhenai.com路径是append/itapply/toITApplyTencentCtlApply.do片段标识是123查询字符串是processInfoId105不过并发所有URL都有以上属性。
HTTP
HTTP协议
是web浏览器和web服务器之间通讯的协议标准Http指定了客户端与服务器如何建立连接如何从无武器请求数据服务器如何响应请求已经最后如何关闭具体有如下步骤 默认情况客户端打开80端口与服务器的一个TCP连接URL中可以指定其他端口客户端向服务器发送消息请求指定路径上的资源。这个请求包括一个首部可选的还可以有一个空行后面是这个请求的数据服务器向客户端发送响应响应以响应码开头后面是包含元数据的首部一个空行已经请求的文档或者错误信息。服务器关闭连接 以上是HTTP1.0的过程在1.1中我们可以通过一个TCP连接连续发送多个请求和响应也就是在第一步和第四部之前2,3步骤反复执行。一般客户端请求如下get请求为例子
GET https://www.zhenai.com/n/myZhenai HTTP/1.1
Host: www.zhenai.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,image/apng,*/*;q0.8
Referer: http://www.zhenai.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q0.9,en;q0.8
Cookie: sidv9EVJ8hYWVYZsn0SVz3f; login_health3f2b2be6d4ad6456edf3aa4152b72895a1af48e0204cf916040dce55e61b8be59179306966300ec32c4851e8c589ec054fb4aff05d7a5270f487aafde733dd0f; p%5E%7Eworkcity%3D10101204%5E%7Esex%3D0%5E%7Emt%3D1%5E%7Enickname%3D%E6%AD%8C%E6%A8%82%5E%7Edby%3D17dece17d471cb1d%5E%7Elh%3D2000003756%5E%7Eage%3D25%5E%7E; preLG_20000037562019-01-2516%3A24%3A07; dgpw1; Hm_lvt_2c8ad67df9e787ad29dbd54ee608f5d21549953761; abt_paramsLANDING%7C903050%7C9%7C0%7C0; _abTest_ext13_0; __detect__grid__1; token2000041337.1550116596108.a7342e5c42a2a90a444c181cf68f9700; gr_user_idd81cf4b0-28b1-4a5f-9a10-1c7e835659fc; ZHENAI_OA_REFERERhttp%3A%2F%2Foa.zhenai.com%2Fappend%2Fitapply%2FtoITApplyTencentCtlApply.do%3FprocessInfoId%3D105
zone: 1012261-tapd-baiduocpc
第一行指定请求类别资源路径HTTP的版本1.1HOST指定服务器名User_agent用来让服务器指定使用的是什么浏览器并且允许服务器发送为特定浏览器类型而优化的文件。Accetp用来告诉服务器客户端可以处理那些数据类型Connectionkeep-alive 此处说明服务器不必在发送数据响应后关闭连接可以保持打开在同一个socket上等待来着客户端的新请求之所以这么做是因为在Web会话中打开和关闭一个链接所花费的时间远远大于传输时间的时间特别是当传输的数据量比较小的时候问题 格外的严重。而且对于使用HTTPS链接时候简历一个安全的Socket链接比常规的更负责因此通过这个参数可以减少不断的销毁重新建的过程提供请求效率。
客户端Socket
使用Socket Internet上数据按照有限大小的包进行传输称为数据报datagram每个数据报包含一个首部header和一个有效载荷payload。首部包含目的地地址端口源头地址端口检查数据完整性已经用于保证可靠传输的其他信息。数据载荷包含数据本身。在传输过程会遇到各种问题要保证数据完整到达是需要蒋书记分解生成各自首部即系入站包首部跟踪那些包收到而哪些没有等繁重工作。因此Socket就是来帮我们解决Socket运行程序员将网络连接看成是另外一个可以读的字节流Socket帮我们掩盖了网络的底层细节如错误检测包大小包分解重传网络地址等。 Socket是两台数据之间的一个链接可以完成7个操作 链接远程机器发送数据接受数据关闭连接绑定端口监听入站数据在绑定端口上接受来自远程计算机的链接 一旦完成第一步建立了链接本地和远程主机都可以送这个socket得到输入流输出流使用这两个流操作来相互发送数据链接是双工的。下例子测试一下Socket编程
public static void main(String[] args) throws NoSuchAlgorithmException, IOException {try(Socket socket new Socket(time.nist.gov, 13)){socket.setSoTimeout(15000);StringBuilder stringBuilder new StringBuilder();InputStream in socket.getInputStream();InputStreamReader inputStreamReader new InputStreamReader(in, ASCII);for (int c inputStreamReader.read(); c ! -1; c inputStreamReader.read()){stringBuilder.append((char) c);}System.out.println(stringBuilder);StringBuilder bufferReaderBuilder new StringBuilder();String s;BufferedReader bufferedReader new BufferedReader(inputStreamReader);while ( (s bufferedReader.readLine()) ! null){bufferReaderBuilder.append(s);}System.out.println(bufferReaderBuilder);in.close();inputStreamReader.close();bufferedReader.close();}catch (Exception e){System.out.println(e.getMessage());}}以上输出和telnet time.nist.gov 13 输出结果是一样的,值得注意的是其中用的ASCII编码并不通用协议
Socket写入服务器
和读服务器中数据一样只是获取的是outputStream如下
public static void main(String[] args) throws NoSuchAlgorithmException, IOException {try(Socket socket new Socket(dict.org, 2628)){socket.setSoTimeout(15000);OutputStream outputStream socket.getOutputStream();Writer writer new OutputStreamWriter(outputStream, UTF-8);writer.write(DEFINE eng-lat gold\r\n);writer.flush();StringBuilder stringBuilder new StringBuilder();InputStream in socket.getInputStream();InputStreamReader inputStreamReader new InputStreamReader(in, ASCII);for (int c inputStreamReader.read(); c ! -1; c inputStreamReader.read()){stringBuilder.append((char) c);}System.out.println(stringBuilder);}catch (Exception e) {e.printStackTrace();}}Socket链接成功之后会自动保护一下熟悉并可以通过java中的方法获取比如:远程地址端口本地地址端口Socket还提供isCloseisConnected方法确认是否关闭状态Socketjava支持九个可设置的选项
Native public final static int TCP_NODELAY 0x0001;
Native public final static int SO_BINDADDR 0x000F;
Native public final static int SO_REUSEADDR 0x04;
Native public final static int SO_BROADCAST 0x0020;
Native public final static int SO_LINGER 0x0080;
Native public final static int IP_TOS 0x3;
Native public final static int SO_TIMEOUT 0x1006;
Native public final static int SO_SNDBUF 0x1001;
Native public final static int SO_RCVBUF 0x1002;
Native public final static int SO_KEEPALIVE 0x0008;
Native public final static int SO_OOBINLINE 0x1003;
//在 java.net.SocketOptions类中Socket异常信息一般都是IOEXCEPTION如果抛这个异常并不知道发生啥他下面的子类异常可以反映出具体原因
public class BindException extends socketException;
public class ConnectionException extends SocketException;
public class NoRouteToHostException extends SocketException;其中BindException标识你没有足够权限使用这个端口单链接被远程机器拒绝而拒绝的原因通常是由于主机繁忙或者有进程在监控这个端口此时会抛出ConnectionException异常最后一点NotRouteToHostException异常标识链接已经超时。
服务器Socket
ServerSocket
ServerSocket server new ServerSocket(13);//创建一个端口是13的本地socket服务
Socket connection server.accept()//改操作会一直阻塞程序直到有一个客户端的连接了13 端口
OutputStream outputStream socket.getOutputStream();
Writer writer new OutputStreamWriter(outputStream);//从socket中获取输出流从而可以将需要传递的数据从服务器输出到管道中。二进制数据
用Socket写入服务器