欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网络编程TCP/IP协议组 博客分类: java 编程 

程序员文章站 2024-03-13 20:11:57
...
TCP/IP是个协议组:
     主要可以分为4层,分别是应用层 ,传输层,网络层,数据链路层。分层的好处在于如果要改变某一个协议时候,不会去影响到其他协议。如同Java中的封装,隔离。


1. 应用层 :负责处理特定的应用程序,在TCP/IP协议组中预存了各类同用的应用服务,比如FTP,DNS,HTTP等等
2. 传输层:对上层应用层提供处于网络连接中的两台计算机之间的数据传输,有两个不同的协议:TCP/UDP、
3. 网络层:处理网络上流动的数据包。(网络上传输的最小数据单元) 该层主要协议有 IP(网际协议) ICMP(internet控制报文协议 用于IP主机 ,路由器之间传递控制消息) IGMP(Internet组管理协议)。这一层规定了通过怎样的路径到达对方的计算机,把数据包传送给对方。
4. 数据链路层,也叫做网络接口层,主要处理网络连接硬件部分,比如操作系统,硬件设备驱动,网卡,光纤等等。

tcp/ip协议组:
     http客户端传输到TCP进行分割表上序号和端口号,转发给网络层,网络层回在数据包上增加作为通讯地的mac地址,然后转发给链路层。接受端接受到数据会一直向上传输数据,一直到应用层。

FTP主要用于传输文件和访问,DNS域名系统协议,有圆点和一串英文字母组成,属于分布式系统。

http协议简介:
     http协议(Hyper Text  Transfer Protocol)属于超文本传输通讯协议,它允许超文本标记语言(HTML) 文档从web服务器传送到客户端浏览器 ,是属于应用层的一种协议,承载与tcp之上,有请求和响应构成,是一个标准的客户端服务器模型。客户端发起请求request(post,get) 服务器接受到请求,然后对数据报文响应(response)回送给浏览器。
http协议:两种方式。1.0 和1.1,
     HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
     HTTP1.1  HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。 HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间  HTTP 1.1中增加Host请求头字段后,WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。
HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。

http协议应用场景:webService= http+xml,Reset =http+json, API的实现:HTTP+XML/JSON

TCP协议 :tcp协议是一个面向连接的、可靠的协议 TCP(transmission control protocol) 是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。字节流服务
    
如下所示:服务端:
                 //建立服务端
                ServerSocket server= new ServerSocket(8888);
                 //等待客户端的响应
                Socket s= server.accept();
                 // 获取客户端胡输入流 和 输出流
                OutputStream os= s.getOutputStream();
                InputStream is= s.getInputStream();
                BufferedReader br= new BufferedReader( new InputStreamReader(is));
                PrintStream bw= new PrintStream( os); //专门用来打印的(写)
                    客户端:        
               //建立客户端
                Socket socket= new Socket( "localhost",8888); //Localized获取本机的IP地
                 // 获取客户端的输入流 和 输出流
                OutputStream os= socket.getOutputStream();
                InputStream is= socket.getInputStream();
                BufferedReader br= new BufferedReader( new InputStreamReader(is));
                PrintStream bw= new PrintStream( os); //专门用来打印的(写)


使用TCP协议传输数据,当数据从A端传到B端后,B端会发送一个确认包(ACK包)给A端,告知A端数据我已收到!UDP协议就没有这种确认机制!这就是为什么说TCP协议可靠,UDP协议不可靠.

UDP协议:udp是一个不可靠的、无连接协议 UDP(user datagram protocol ) UDP向应用程序提供了一种发送封装的原始IP数据报的方法、并且发送时无需建立连接。是一种不可靠的连接
UDP 协议是无连接的数据传输协议并且无重传机制,会发生丢包、收到重复包、乱序等情况。而对于数据精确性要求不高的状态数据以及视频数据,丢包的影响不大。因为会不断收到新的包,丢失的个别包会有新的包来覆盖,所以只需在远程控制系统的通信部分自行处理乱序及重复包的问题,而对于丢包的问题一般不作处理。    但对于命令包这种需要精确收发的数据, 可在程序的开发中加入丢包重发和超时丢弃的处理。 当然,如果开发的是对于实时性要求不高的事件型控制命令的传输,不希望发生指令的丢失也可以直接采用TCP协议。TCP的重传机制正好适合这种情况。 QQ普通会员就是使用的UDP协议进行传输数据!
udp 服务器:
public class UdpServer {
      public static void main(String[] args) {
            DatagramSocket ds = null;
            try{
                  ds = new DatagramSocket(5000);//创建udp连接
                  byte[] buf = new byte[1024];
                  DatagramPacket dp =new DatagramPacket(buf, buf.length);//将数据包拆分buf
                  ds.receive(dp);//接受数据包
                  String mes = new String(buf);
                  System.out.println(mes);
            }catch(Exception e){
                  e.printStackTrace();
            }finally{
                  if(ds !=null){
                        ds.close();
                  }
            }
      }
}
udp 客户端
public class UdpClient {
      public static void main(String[] args) {
            DatagramSocket ds = null;
            String mes = "hello, 你好";
            try{
                  ds = new DatagramSocket();//创建UDP连接
                  byte[] buf = mes.getBytes();
                  DatagramPacket dp = new DatagramPacket(buf, buf.length,
                              new InetSocketAddress("127.0.0.1", 5000));//将数据包打好,并指定到数据包
                  ds.send(dp);//发送数据包
                  
            }catch(Exception e){
                  e.printStackTrace();
            }finally{
                  ds.close();
            }
      }
}


网络层:IP 名为Internet Protocol,翻译层网际协议,位于网络层。 ip的作用,主要将各种数据包传给对方,要确保传送到对放那里,就需要满足各种条件,最重要的就是两个一个是ip地址,一个mac地址。ip地址节点本分配到的地址,mac地址指网卡地址,基本不会改变。所属固定地址。可以使用ARP协议凭借MAC地址进行通信。ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对于的MAC地址。在网络上通信的双方经过多台计算机,或者网络,中转连接到对方,利用中转时,就是利用一个中转地址MAC地址连接对方。

ip tcp DNS 和HTTP协议的关系。
我们访问一个网站 比如www.baidu.com.首先将域名发送给DNS去解析,DNS解析后将百度的IP地址返回给客户端,然后发起http请求,生层整队目标web服务器的请求报文,然后请求报文传输给传输层,tcp 会去将http请求按序号分给层字节流报文段,然后到网络层 IP地址会去搜索地方ip地址,一边中转,一边传输。然后到了服务器tcp会成客户端接受到的报文按照序号重组报文段,服务器http会对请求内容进行处理响应,然后服务器也会tcp/Ip通信协议,回传响应,然后输出到客户端,展示给页面。

URI和URL关系
      
URI :统一资源标识符,是一个用于标识某一互联网资源名称的字符串。唯一的,用于标识某一互联网资源。
URL:统一资源定位符,它描述一台服务器某特定资源的特定位置,能过通过明确的一个地址找到资源。(资源所处的位置)

URI和URL关系:URL是URI的子集。
URI格式:http://user:pass@www.example.com: 80/home/index.html?age=11#mask主要有方案+主机+路径+查询 +片段
http:协议方案名
user:pass:登录信息(认证)
www.example.com:服务器地址
80:端口号
/home/index.html:文件路径
age=11:查询字符串
mask:片段标识符

协议方案名:http:https:、ftp:等,在获取资源时要指定协议类型,方案名不分大小写。解析url按照那种方案开始。
登录信息(认证):
     指定用户名和密码作为服务器端获取资源时必要的登录信息,此项是可选的。用户名和密码用:分割,然后@符号分割后面的地址。
服务器地址:
     使用绝对URI必须指定待访问的服务器地址。
服务器端口号:
     指定服务器连接的网络端口,此项是可选的。
路径组件:
     指定服务器的文件路径来定位资源的特定资源,格式为:/home/index.html
参数:
     为应用程序提供访问资源所需的附加信息.列如:ftp://127.24.24.24/pud/pic;type=d
查询字符串:
     针对已指定的文件路径的资源,可以使用查询字符串传入任意参数,此项是可选的。很多查询数据库,通过参数去搜素范围变小
片段标识符:
     通常可标记出以获取资源中的子资源(文档内的某一个位置),此项是可以选择的。是用#和ur其他部分l分开。客户端是不能将片段传送给服务器的,服务器只处理这个url对象,不处理某个片段。根据片段显示那块片段内容。
相关标签: 编程