network_questions

1.概述

定义:计算机网络是用通信设备和线路将分散在不同地点的有独立功能的多个计算机系统互相连接起来,并按照网络协议进行数据通信,实现资源共享的计算机集合。

协议:控制网络中信息接收和发送的一组软件。定义了通信实体之间发送、接收报文的格式和传输顺序,以及收到报文所采取的动作。

因特网服务类型
  • 面向连接服务(connection-oriented service)
    • 可靠的数据传送
    • 流控制
    • 拥塞控制
  • 无连接服务(connectionless service)
    • 不可靠:源主机不能确定分组是否已经到达目的地。
    • 无流控制或拥塞控制的功能。
数据如何通过网络传送?
  • 电路交换
  • 分组交换

以下分别详细介绍

电路交换:通信双方必须先建立一个专用的连接(电路),一直维持,直到通信结束。

  • 多路复用:在一条传输链路上同时建立多条连接,分别传输数据。
    • 频分多路复用FDM(frequency-division multiplexing)
    • 时分多路复用TDM (time-division multiplexing)

分组交换:源端将报文划分为较小的数据块(分组packet);
每个分组通过一系列链路和分组交换机传送,直到目的端
目的端恢复原报文。

因特网协议栈
  • 应用层:报文
    • 提供各种网络应用。传输应用报文。
    • FTP、 SMTP、 HTTP
  • 运输层:报文段
    • 在应用程序的客户机和服务器之间提供传输应用层报文服务。传输报文段。
    • TCP、 UDP
  • 网络层:数据报
    • 主机和主机之间传输网络层分组(数据报)
    • IP协议、 选路协议
  • 链路层:帧
    • 在邻近单元之间传输数据(帧 )
    • PPP、以太网
  • 物理层:比特
    • 在节点之间传输比特流
    • 传输媒体

2.应用层

主要掌握应用层协议http,socket api

http

请求报文

响应报文:

HTTP/1.1 200 OK 
Connection close
Date: Thu, 06 Aug 1998 12:00:15 GMT 
服务器: Apache/1.3.0 (Unix) 
Last-Modified: Mon, 22 Jun 1998... 
Content-Length: 6821 
Content-Type: text/html

data data data data data ... 

响应状态码:

  • 200 OK
    请求成功,请求的对象在这个报文后面
  • 301 Moved Permanently
    请求的对象已转移,新的URL在响应报文的Location:首部行中指定
  • 400 Bad Request
    请求报文不为服务器理解
  • 404 Not Found
    请求的文档没有在该服务器上发现
  • 505 HTTP Version Not Supported
socket

client

import java.io.*; 
import java.net.*; 
class TCP Client { 

    public static void main(String argv[]) throws Exception 
    { 
        String sentence; 
        String modifiedSentence; 

        BufferedReader inFromUser = 
          new BufferedReader(new InputStreamReader(System.in)); 

        Socket ClientSocket = new Socket("hostname", 6789); 

        DataOutputStream outToServer = 
          new DataOutputStream(ClientSocket.getOutputStream()); 
        BufferedReader inFromServer = 
          new BufferedReader(new
          InputStreamReader(ClientSocket.getInputStream())); 

        sentence = inFromUser.readLine(); 

        outToServer.writeBytes(sentence + '\n'); 

        modifiedSentence = inFromServer.readLine(); 

        System.out.println("FROM Server: " + modifiedSentence); 

 ClientSocket.close(); 

    } 
} 

server

import java.io.*; 
import java.net.*; 

class TCP Server { 

  public static void main(String argv[]) throws Exception 
    { 
      String ClientSentence; 
      String capitalizedSentence; 

      ServerSocket welcomeSocket = new ServerSocket(6789); 

      while(true) { 

            Socket connectionSocket = welcomeSocket.accept(); 

           BufferedReader inFromClient = 
              new BufferedReader(new
              InputStreamReader(connectionSocket.getInputStream())); 
           DataOutputStream  outToClient = 
             new DataOutputStream(connectionSocket.getOutputStream()); 

           ClientSentence = inFromClient.readLine(); 

           capitalizedSentence = ClientSentence.toUpperCase() + '\n'; 

           outToClient.writeBytes(capitalizedSentence); 
        } 
    } 
} 

3.传输层

在运行不同主机上应用进程之间提供逻辑通信
传输协议运行在端系统中
发送方:将应用报文划分为段,传向网络层
接收方:将段重新装配为报文,传向应用层
应用可供使用的传输协议不止一个
因特网:TCP和UDP

udp

为何要有 UDP协议?
无连接创建(它将增加时延)
简单:在发送方、接收方无连接状态
段首部小
无拥塞控制: UDP能够尽可能快地传输。

tcp

序号:
报文段中第1个数据字节在字节流中的位置编号

确认号:
期望从对方收到下一个字节的序号
累计应答

三次握手:

  • 步骤 1: 客户机向服务器发送 TCP SYN报文段
    • 指定初始序号
    • 没有数据
  • 步骤 2: 服务器收到SYN报文段, 用SYNACK报文段回复
    • 服务器为该连接分配缓冲区和变量
    • 指定服务器初始序号
  • 步骤 3: 客户机接收到 SYNACK, 用ACK报文段回复,可能包含数据

  • 步骤 1: 客户机向服务器发送TCP FIN控制报文段

  • 步骤 2: 服务器收到FIN,用ACK回答。关闭连接,发送FIN
  • 步骤 3: 客户机收到FIN, 用ACK回答
  • 步骤 4: 服务器接收ACK,连接关闭

4.网络层

主要理解ip协议和选路算法

NAT: 网络地址转换

4.链路层

帧, 链路访问:
将数据报封装进帧,加上首部和尾部
如果共享媒体,信道访问
位于帧首部的“MAC”地址标识源、目的地

ARP: 地址解析协议

LAN上的每个IP节点(主机、路由器)都有ARP表
ARP表: 对美协LAN节点的IP/MAC地址映射
< IP地址; MAC地址; TTL>

import ast from dataclasses import dataclass from typing import List import pandas as pd import json ["text", "六十一岁还能办什么保险"] @dataclass class FAQ: title: str sim_questions: List[str] answer: str faq_id: int ori_data = pd.read_csv('baoxianzhidao_filter.csv') data = [] exist_titles = set() for index, row in enumerate(ori_data.iterrows()): row_dict = row[1] title = row_dict['title'] if title not in exist_titles: data.append(FAQ(title=title, answer=row_dict['reply'], sim_questions=[title], faq_id=index)) exist_titles.add(title) from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks pipeline_ins = pipeline(Tasks.faq_question_answering, 'damo/nlp_mgimn_faq-question-answering_chinese-base') bsz = 32 all_sentence_vecs = [] batch = [] sentence_list = [faq.title for faq in data] for i,sent in enumerate(sentence_list): batch.append(sent) if len(batch) == bsz or (i == len(sentence_list)-1 and len(batch)>0): # if i == len(sentence_list)-1 and len(batch)>0: sentence_vecs = pipeline_ins.get_sentence_embedding(batch) all_sentence_vecs.extend(sentence_vecs) batch.clear() import faiss import numpy as np hidden_size = pipeline_ins.model.network.bert.config.hidden_size # hidden_size = pipeline_ins.model.bert.config.hidden_size index = faiss.IndexFlatIP(hidden_size) vecs = np.asarray(all_sentence_vecs, dtype='float32') index.add(vecs) from modelscope.outputs import OutputKeys def ask_faq(input, history=[]): # step1: get sentence vector of query query_vec = pipeline_ins.get_sentence_embedding([input])[0] query_vec = np.asarray(query_vec, dtype='float32').reshape([1, -1]) # step2: faq dense retrieval _, indices = index.search(query_vec, k=30) # step3: build support set support_set = [] for i in indices.tolist()[0]: faq = data[i] support_set.append({"text": faq.title, "label": faq.faq_id, "index": i}) # step4: faq ranking rst = pipeline_ins(input={"query_set": input, "support_set": support_set}) rst = rst[OutputKeys.OUTPUT][0][0] pred_label = rst['label'] pred_score = rst['score'] # get answer by faq_id pred_answer = "" pred_title = "" for faq in data: if faq.faq_id == pred_label: pred_answer = faq.answer pred_title = faq.title break history.append((f'{pred_answer}|(pred_title:{pred_title},pred_score:{pred_score:.3f})')) return history优化这段代码
04-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值