zoukankan      html  css  js  c++  java
  • 网络基础之HTTP、TCP/IP、Socket

    一、HTTP相关

    https://www.cnblogs.com/sunny-sl/p/6529830.html
    https://www.cnblogs.com/ranyonsue/p/5984001.html

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
    -特点
    -无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
    -无状态:HTTP协议是无状态协议

    请求消息Request

    1.请求行(request line):请求类型、要访问的资源及所使用的HTTP版本(GET /562f259838.jpg HTTP/1.1)
    2.请求头部(header):用来说明服务器要使用的附加信息
    3.空行
    4.请求数据:也叫主体,可以添加任意的其他数据

    响应消息Response

    1.状态行:HTTP协议版本号, 状态码, 状态消息(HTTP/1.1 200 OK)
    2.消息报头:用来说明客户端要使用的一些附加信息
    3.空行
    4.响应正文:服务器返回给客户端的文本信息

    HTTP1.1版本新特性

    1.默认持久连接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求
    2.管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应
    3.断点续传原理

    -HTTP协议常用六种请求方法
    -GET:发送一个请求来取得服务器上的某一资源
    -PUT:向指定资源位置上传其最新内容
    -PATCH:更新
    -POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件),可能会导致新的资源的创建和/或已有资源的修改
    -DELETE:请求服务器删除Request-URI所标识的资源

    幂等性:任意多次执行所产生的影响均与一次执行的影响相同。
    POST方法不是幂等的,而PUT方法则有幂等性

    在浏览器地址栏键入URL,按下回车之后会经历以下流程:
    1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
    2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
    3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
    4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
    5、释放 TCP连接;
    6、浏览器将该 html 文本并显示内容。

    二、TCP相关

    tcp和udp区别?
    https://www.cnblogs.com/xiaomayizoe/p/5258754.html TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低 UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快。进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据所要达到的Socket(主机地址和端口号),然后再将数据报发送出去
    两台主机最多能建立多少tcp连接?
    https://www.cnblogs.com/dudu/p/5237777.html https://www.jianshu.com/p/4a58761d758f http://www.cnblogs.com/hellojesson/p/6381863.html

    对于TCP服务端进程来说,他可以同时连接的客户端数量并不受限于可用端口号。每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can'topen so many files”。并发连接数受限于linux可打开文件数,这个数是可以配置的,即修改最大TCP连接端口数MaxUserPort限制,可以非常大,所以实际上受限于系统性能。

    实际上,确实有个限制端口号的配置,就是MaxUserPort,这是一台主机向外连接使用端口数的限制,但是这个MaxUserPort确实和服务器可以承载的来自客户端的并发连接数没有关系。修改方法:在注册表HKLMSYSTEMCurrentControlSetServicesTcpipParameters中添加名为MaxUserPort,类型为DWORD(32-bit),值为65543(10进制)的项目并重启计算机。

    另外一个误解,就是accept之后产生的已连接套接字占用了新的端口。这个绝对是错误的,linux内核不会这么写的,因为完全没必要嘛。客户端连接上来之后产生的这个socket fd就是用来区分客户端的,里面会填上客户端的ip和端口作为发包用,来自客户端的包也会使用这个fd去读取。可以试试netstat -ano,然后起一个服务器看下,客户端连上来这后产生的套接字的服务端端口还是监听的端口。

    对客户端来讲,2^16=65536

    三次握手,四次挥手?
    - 解决思路与前提 - 网络是不可靠的,任何包都有可能丢 - 遇见问题、解决问题、不断迭代 - 能用就好 ![](https://img2018.cnblogs.com/blog/1282009/201904/1282009-20190410131014449-1695087883.jpg) ![](https://img2018.cnblogs.com/blog/1282009/201904/1282009-20190410131025442-231775215.jpg)

    挥手时之所以多一次,是因为接收方可能还没准备好,待准备好后再发送FIN包,即需要将ack包和FIN包分开发送。

    三、Socket编程

    https://www.cnblogs.com/rocomp/p/4790340.html

    Ping命令,使用的是ICMP协议,是“Internet Control Message Protocol”(Internet控制消息协议)的缩写,是TCP/IP协议族的一个子协议

    IP地址:为实现网络中不同计算机之间的通信,每台计算机都必须有一个唯一的标识---IP地址。32位二进制
    端口:区分一台主机的多个不同应用程序,端口号范围为0-65535,其中0-1023位为系统保留。如:HTTP:80 FTP:21 Telnet:23

    服务器端:
    ① 创建ServerSocket对象,绑定监听端口
    ② 通过accept()方法监听客户端请求
    ③ 连接建立后,通过输入流读取客户端发送的请求信息
    ④ 通过输出流向客户端发送响应信息
    ⑤ 关闭相关资源

    /**
     * 基于TCP协议的Socket通信,实现用户登录,服务端
    */
    //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
    ServerSocket serverSocket =newServerSocket(10086);//1024-65535的某个端口
    //2、调用accept()方法开始监听,等待客户端的连接
    Socket socket = serverSocket.accept();
    //3、获取输入流,并读取客户端信息
    InputStream is = socket.getInputStream();
    InputStreamReader isr =newInputStreamReader(is);
    BufferedReader br =newBufferedReader(isr);
    String info =null;
    while((info=br.readLine())!=null){
    System.out.println("我是服务器,客户端说:"+info);
    }
    socket.shutdownInput();//关闭输入流
    //4、获取输出流,响应客户端的请求
    OutputStream os = socket.getOutputStream();
    PrintWriter pw = new PrintWriter(os);
    pw.write("欢迎您!");
    pw.flush();
    
    
    //5、关闭资源
    pw.close();
    os.close();
    br.close();
    isr.close();
    is.close();
    socket.close();
    serverSocket.close();
    

    客户端:
    ① 创建Socket对象,指明需要连接的服务器的地址和端口号
    ② 连接建立后,通过输出流想服务器端发送请求信息
    ③ 通过输入流获取服务器响应的信息
    ④ 关闭响应资源

    //客户端
    //1、创建客户端Socket,指定服务器地址和端口
    Socket socket =newSocket("localhost",10086);
    //2、获取输出流,向服务器端发送信息
    OutputStream os = socket.getOutputStream();//字节输出流
    PrintWriter pw =newPrintWriter(os);//将输出流包装成打印流
    pw.write("用户名:admin;密码:123");
    pw.flush();
    socket.shutdownOutput();
    //3、获取输入流,并读取服务器端的响应信息
    InputStream is = socket.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String info = null;
    while((info=br.readLine())!null){
     System.out.println("我是客户端,服务器说:"+info);
    }
    
    //4、关闭资源
    br.close();
    is.close();
    pw.close();
    os.close();
    socket.close();
    
  • 相关阅读:
    有关多线程的一些技术问题
    Remoting VS WCF 传输效率对比
    中英文术语对照表
    WCF配置文件全攻略
    架构设计之分布式文件系统
    Rails性能优化简明指南 (转载)
    不要活在别人的生活里(摘自开复网)
    find 命令 使用 (转载)
    turbo C BGI 基本图形接口的 例子
    如何编写Ruby控制台程序(一)
  • 原文地址:https://www.cnblogs.com/xiaobingzi/p/10682757.html
Copyright © 2011-2022 走看看