type
status
date
slug
summary
tags
category
icon
password

环境搭建

virtual box虚拟机的配置

  1. 下载并安装virtual box和vm image
    1. Install VirtualBox.
      Download the VM image.
      并完全参照教程在virtual box里面引入vm image
  1. 本地使用ssh连接到虚拟机 Connect to your VM
    1. 📙
      The VM image is set up so that VirtualBox will forward TCP connections to localhost:2222 on the Host machine to port 22 (ssh) on the VM. When your VM is running, you should be able to connect as follows:
      这段话的意思是:virtualbox会转发TCP连接到本机的localhost:2222,本机2222端口对应虚拟机的22端口,当虚拟机运行时可以用以下指令进行ssh连接

用vscode进行ssh远程连接+免密登录

参考:
  1. 在.ssh/config文件中输入以下内容
    1. 我的配置:
      notion image
      其中:Host后面的名字可以随意更改
      📙
      SSH config是Linux系统下针对SSH客户端的一个参数配置方案,可以将一些关于SSH命令的参数放到配置文件中去,执行ssh命令的时候从文件中读取,简化命令行的操作。这篇短博客记录ssh config相关的配置问题和使用方法。
      SSH 参数配置有3个层次:
      1. 命令行参数,如p 10086i /path/to/identity_file 等选项来设置SSH的端口号或认证证书位置
      1. 针对某个用户的配置文件,所在路径为~/.ssh/config,默认是不存在的,需要手动创建
      1. 针对系统所有用户的配置文件,,所在路径为/etc/ssh/ssh_config参数重要性的顺序也是1>2>3,即越近的配置重要性越高。这里主要讲述第2种情况下的配置方式,即针对~/.ssh/config文件的写法进行说明。
      这一步完成后已经可以在vscode上进行ssh远程登陆:
      notion image
      notion image
       
  1. 打开.ssh/id_rsa.pub文件并复制公钥至虚拟机的这个位置
    1. notion image
      完成配置后就可以远程免密登陆

Fetch a Web Page(http://cs144.keithw.org/hello

telnet cs144.keithw.org http

  • telnet
    • Telnet是一个实用的远程连接命令,采用的是TCP/IP协议
    • 它为用户提供了在本地计算机上完成远程主机工作的能力,终端使用者在电脑上使用telnet程序,用它连接到服务器
    • 终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样,可以在本地就能控制服务器
  • 执行这条命令相当于:
    • 告诉telnet程序,在本机和另一个电脑上(named cs144.keithw.org)打开一个可靠的Byte stream
    • 在另外一个电脑上打开一个特定的服务(the “http” service, for the Hyper-Text Transfer Protocol, used by the World Wide Web)
  • 关闭程序的方式:
    • 输入CTRL ]并按回车
  • 执行结果

    GET /hello HTTP/1.1

    • 告诉服务器第三个斜杠后面的内容,也就是/hello
    • the path part of the URL

    Host: cs144.keithw.org

    • 告诉服务器http://和第三个斜杠之间的内容
    • the host part of the URL

    Connection: close

    • This tells the server that you are finished making requests, and it should close the connection as soon as it finishes replying.
    • 再按一次回车
      • 告诉服务器已经完成HTTP请求
    notion image

    Listening and connecting

    netcat -v -l -p 9090

    📙
    netccat是一个通过TCP/UDP在网络中进行读写数据工具(命令),被称为“瑞士军刀”,主要用于调试领域、传输领域甚至黑客攻击领域。利用该工具,可以将网络中一端的数据完整的发送至另一台主机终端显示或存储,常见的应用为文件传输、与好友即时通信、传输流媒体或者作为用来验证服务器的独立的客户端。当然,也可以在脚本中使用该工具。 netcat常用参数:
    • l: 开启监听
    • p:指定端口
    • t: 以telnet形式应答
    • e:程序重定向
    • n:以数字形式表示ip
    • v:显示执行命令过程
    • z : 不进行交互,直接显示结果
    • u :使用UDP协议传输
    • w : 设置超时时间

    telnet localhost 9090

    📙
    telnet可以实现的功能:
    连接服务器端口,并进行通信,登录远程telnet服务器,使用命令行对其进行控制
    nc可以实现的功能:
    监听服务器端口,并与客户端通信(最多只能接收一个客户端),对指定服务器进行端口扫描,作为客户端连接到远程服务器进行通信

    Writing a network program using an OS stream socket

    前置知识

    stream socket

    • the ability to create a reliable bidirectional byte stream between two programs
    • When two stream sockets are connected, any bytes written to one socket will eventually come out in the same order from the other socket on the other computer

    Internet datagrams

    • Each datagram contains some metadata (headers) that specifies things like the source and destination addresses
    • playload data,有效载荷数据,指传输的数据中除去协议头和校验码等控制信息之外的实际数据部分
    • 虽然最好的结果是传输了所有的datagram,但实际上可能出现:
      • 数据丢失
      • 发送故障
      • 发送内容改变
      • 发送重复

    关于http请求

    • HTTP是一种用作获取诸如 HTML 文档这类资源的协议。它是 Web 上进行任何数据交换的基础,同时,也是一种客户端—服务器(client-server)协议
    • HTTP 是一种应用层的协议,通过TCP,或者是TLS——一种加密过的 TCP 连接——来发送
    • 一个网络连接是由传输层来控制的,因此从根本上说不属于 HTTP 的范畴
      • HTTP 协议并不需要下面的传输层协议是面向连接的,仅仅需要它是可靠的,或不会丢失消息(至少,某个情况下告知错误)
      • 在互联网两个最常用的传输层协议中,TCP 是可靠的而 UDP 不是
      • HTTP 因此而依靠于 TCP 的标准,即面向链接的

    参考

    主要是查看类和接口

    代码及思路

    思路和需要用的接口

    因为要使用HTTP请求,因此要先建立TCP连接
    • 构造一个Address类型的变量,获取发送HTTP请求需要的host的address
      • Address() [2/4]
        Address::Address(const std::string & hostname,const std::string & service )
    • 构造一个TCPSocket类型的变量,并与这个地址相连接,注意TCPSocket继承了Socket类
      • TCPSocket() [2/2]
        TCPSocket::TCPSocket()
        connect()
        void Socket::connect(const Address & address)
    • 将TCPsocket看成文件,往里面写要传输的内容
      • 💙
        To your program and to the Web server, the socket looks like an ordinary file descriptor (similar to a file on disk, or to the stdin or stdout I/O streams).
        write() [1/3]
        size_t FileDescriptor::write(BufferViewList buffer)
    • 接收server的信息
      • 💙
        You’ll discover that your incoming byte stream has ended because your socket will reach “EOF” (end of file) when you have read the entire byte stream coming from the server. That’s how your client will know that the server has finished its reply.
        read() [2/2]
        void FileDescriptor::read(std::string & str)

    代码

    An in-memory reliable byte stream

    💙
    To be clear: the byte stream is finite, but it can be almost arbitrarily long before the writer ends the input and finishes the stream. Your implementation must be able to handle streams that are much longer than the capacity. The capacity limits the number of bytes that are held in memory (written but not yet read) at a given point, but does not limit the length of the stream.

    接口

    代码及思路

    采用string作为stream的数据结构

    • byte_stream.hh
      • byte_stream.cc
        • 关于std::string_view
          • 静态字符串的处理:所谓静态字符串,就是编译时已经固定的字符串,他们存储在二进制文件的静态存储区,而且程序只能读取,不能改动
          • C++17中我们可以使用std::string_view来获取一个字符串的视图,字符串视图并不真正的创建或者拷贝字符串,而只是拥有一个字符串的查看功能。std::string_view比std::string的性能要高很多,因为每个std::string都独自拥有一份字符串的拷贝,而std::string_view只是记录了自己对应的字符串的指针和偏移位置。当我们在只是查看字符串的函数中可以直接使用std::string_view来代替
          • string_view的本质是指针
            • The idea is always to store a pair of pointer-to-first-element and size of some existing data array or string.
        • 运行结果
          • notion image

        优化传输速度:用std::deque<std::string> 来存储stream

        • byte_stream.hh
          • byte_stream.cc
            • 运行结果
              • notion image
                 
            数组Computer Networking Notes
            • Giscus