计算机网络|计算机网络、网络编程笔记

计算机自定向下笔记:https://gy23333.github.io/2020/03/16/%E3%80%8A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C-%E8%87%AA%E9%A1%B6%E5%90%91%E4%B8%8B%E6%96%B9%E6%B3%95%E3%80%8B%E7%AC%94%E8%AE%B0/
1.TCP字节流服务和UDP数据报服务的区别
1)表现形式:通信双方是否执行相同次数的读、写操作;
2)具体区别:
字节流:
发送端应用程序执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区中。当TCP模块真正开始发送时,发送缓冲区的数据被封装成一个或多个TCP报文段发出。因此,TCP模块发出的TCO报文段个数和应用程序执行的写操作次数没有固定的数量关系;
接收端类似,TCP模块将接受到的报文携带的应用程序数据按照TCP报文段序号依次放入接受缓存区,通知应用程序读取数据,应用程序依据用户指定的应用程序读缓存区大小,分一次或多次读取缓存区。因此,读操作次数和接受到的报文段也没有固定数量关系。
发送端执行的写操作次数和接收端执行的读操作次数没有任何数量关系,这就是字节流的概念:应用程序对数据的发送和接受没有边界限制。
UDP则不然,一次写操作,发送一个UDP数据报,接受端必须及时针对每一个UDP数据报执行读操作,否则丢包。
2.错误检查
错误检查方法:
1)用专门的包装函数代替原api
2)在每次函数调用下面加上一个assert()宏
比如:
ret=listen(sock,5);
assert(ret!=-1);
3.“同步”与“异步”
在I/O模型中,“同步”和“异步”区分的是内核向应用程序通知的是何种I/O事件(是就绪事件还是完成事件),以及该由谁来完成I/O读写(是应用程序还是内核),同步都是前者,异步都是后者。
在并发模式中,“同步”指的是程序完全按照代码序列的顺序执行;“异步”指的是程序的执行需要由系统事件来驱动。常见的系统事件包括中断、信号等。
4.阻塞与非阻塞
阻塞非阻塞: 请求不能立即得到应答,需要等待,那就是阻塞;否则可以理解为非阻塞。
计算机网络|计算机网络、网络编程笔记
文章图片
计算机网络|计算机网络、网络编程笔记
文章图片

6.I/O复用函数中可写意味着socket写缓冲区有足够空间可写入。
一般只有在write一次没有写完,写缓冲区不够时需要注册POLLOUT/EPOLLOUT,等待socket缓冲区中的数据被对方接收之后,写缓冲区就会有空闲空间可以继续write。
查看tcp缓冲区大小:
读缓冲区:/proc/sys/net/ipv4/tcp_rmem
该文件包含3个整数值,分别是:min,default,max
写缓冲区:/proc/sys/net/ipv4/tcp_wmem
该文件包含3个整数值,分别是:min,default,max
7.epoll的LT(电平触发)和ET(边沿触发)
LT支持阻塞或非阻塞文件描述符,ET仅支持非阻塞。
LT模式下,epoll_wait检测到有事件发生后通知应用程序,若事件未处理完毕,下次继续通知;
ET模式下,检测到有事件发生后仅通知应用程序一次,无论是否处理完毕,下次不会通知,因此必须一次处理完毕。
ET模式在epoll_wait返回后就将fd从就绪列表中删除,而LT会将fd继续留在就绪列表中,下一次epoll_wait时,必须进行一次poll检测状态后从而选择是否筛选掉,从而导致就绪列表比ET模式下长。
【计算机网络|计算机网络、网络编程笔记】举例:
假设现在对方一口气发送了大量数据过来,以至于这边没法通过一次read就全部读取完毕。
由于ET模式只会通知一次,所以这边对应的数据读取函数中不得不循环read多次,以保证把对方本次发送的数据全部读取完毕。比如说这样:

while ((n = read(...)) > 0) { .... }

否则如果你只read一次,那么剩下的那些数据可能就永远也没有通知了。由于上面那个循环的存在,文件描述符必须是非阻塞的。
而LT模式会持续通知直到你把对方本次发送的数据全部读取完毕,所以这边对应的数据读取函数中只需要read一次就行了。
使用ET模式,特定场景下会比LT更快,因为它可以便捷的处理EPOLLOUT事件,省去打开与关闭EPOLLOUT的epoll_ctl(EPOLL_CTL_MOD)调用。从而有可能让你的性能得到一定的提升。例如你需要写出1M的数据,写出到socket 256k时,返回了EAGAIN。
ET模式下,当再次epoll返回EPOLLOUT事件时,继续写出待写出的数据,当没有数据需要写出时,不处理直接略过即可。
而LT模式则需要先打开EPOLLOUT,当没有数据需要写出时,再关闭EPOLLOUT(否则会一直返回EPOLLOUT事件)总体来说,ET处理EPOLLOUT方便高效些,LT不容易遗漏事件、不易产生bug如果server的响应通常较小,不会触发EPOLLOUT,那么适合使用LT,例如redis等。而nginx作为高性能的通用服务器,网络流量可以跑满达到1G,这种情况下很容易触发EPOLLOUT,则使用ET。
ET模式下,EPOLLOUT触发条件有:
1)缓冲区满–>缓冲区非满;
2)同时监听EPOLLOUT和EPOLLIN事件 时,当有IN 事件发生,都会顺带一个OUT事件;
3)一个客户端connect过来,accept成功后会触发一次OUT事件。
ET更适合写,LT更适合读。
8.统一事件源:把信号的主要处理逻辑放到程序的主循环中,当信号处理函数被触发时,它只是简单地通知主循环接收到信号,并把信号值传递给主循环,主循环再根据接受到的信号值执行对应逻辑代码。
9.三次握手、四次挥手状态转移图
计算机网络|计算机网络、网络编程笔记
文章图片
其中报文段5、6可以合并为一个报文段。
三次握手:
计算机网络|计算机网络、网络编程笔记
文章图片
计算机网络|计算机网络、网络编程笔记
文章图片

10.通信大小端转换问题
short 或者 long的数据在进行通信的时候最好养成:
1、发送的时候使用:htons(l)
2、接受的时候使用:ntohs(l)
而不要理会两边的通信是否需要这么做。
更好的方法是不用int型的数据通信,从来都是字符串通信,发送方利用sprintf组织,接收方利用atoi进行转换。


11.为什么客户端connect默认不允许复用端口,而服务端accept后返回的socket和欢迎socket使用同一个端口?
scoket开启SO_REUSEADDR选项后可以复用端口。
默认不允许是因为,本地端口唯一时,永远都不会造成TCP四元组的冲突。
否则,两个TCP使用同一端口,并且连接同样的{目的IP:目的port}时,四元组完全一样,无法区分。
12.流量统计
wireshark 中 Statistics/Conversions 可以看到数据传输速率。
1MB/s = 8Mb/s
进行压测时,普通网络很容易达到带宽上限。
13.如何增大进程最大描述符数量?
  1. 打开/etc/security/limits.conf 添加:
    root softnofile65535 root hardnofile65535

  2. 使用root权限打开服务器进程。
    web服务器最好增大最大描述符数量。
14.欢迎套接字和连接套接字的端口一样吗?
一样,因为客户端socket连接的是欢迎套接字的ip:port,所以端口一定不会改变。
链路层 ARP ARP(Address Resolution Protocol),地址解析协议
IP地址主要是为了路由,将消息路由到目的IP所在子网,最终通过ARP来查找目的IP对应MAC地址(物理地址)。
  • 局域网中的每个IP结点(主机、路由器)都有ARP表
  • ARP表:局域网结点的IP地址和MAC地址的对应关系
同一子网内的地址解析 A想要发送数据报给B,但是B的MAC地址没有记录在A的ARP表中。
  • A发送一个
    广播帧
    ——查询ARP分组,包含B的IP地址
    • 目的MAC地址:FF-FF-FF-FF-FF-FF
    • 所有结点都会收到该ARP查询分组
  • B接收到ARP分组,给A回复B的MAC地址
    • 给A的MAC地址单播帧——响应APR分组
  • A在ARP表中缓存IP到MAC地址对,直至超时TTL
ARP即插即用:ARP表自动建立,不需要系统管理员来配置
不同子网的地址解析 不同子网的A和B通过路由器R发送数据报,A只知道B的IP地址,不知道B的MAC地址
  • A会用子网掩码来判断是否在同一子网。
    • A用自己所配置的IP地址的子网掩码对B的IP地址做一次与运算,所得的网络地址与自己的网络地址相比较。
    • 自己的网络地址也同样是用A自己的IP地址与自己的子网掩码进行异或所得。如果不同说明在不同子网,A会将目的MAC设置为网关MAC。
  • A创建IP报文(IP地址在整个传输过程中不改变)
    • 源IP地址:A的IP
    • 目的IP地址:B的IP
  • A创建数据帧,在IP报文的基础上,加上MAC地址
    • 源MAC地址:A的MAC
    • 目的MAC地址:路由器R左端的MAC(路由器R左端与A在一个子网中)
  • 帧从A传到路由器R
  • 路由器R接收帧,并从路由器R的数据链路层传到网络层,从数据帧拆成IP数据报
  • 路由器R在IP报文的基础上,加上新的MAC地址段,传到数据链路层
    • 源MAC地址:路由器R右端的MAC(路由器R右端与B在一个子网中)
    • 目的MAC地址:B的MAC
  • 帧从路由器R传到B,B接收到数据
跨多个子网的地址解析 假如A在北京B在广州
  • 这时A网关G1没有任何端口位于B的子网,但是G1的路由表中仍然会有B所在子网(或超网)的路由条目。
  • 每个路由条目都会有下一跳的信息。而这个下一跳无论是直接与G1连接还是间接与G1连接然后通过路由递归,最终都会有某个端口作为出接口。
  • 这个端口可能需要一次ARP交互来得到下一跳路由器G2与G1直连接口的MAC地址,然后依此类推,直到最终到达与B所在子网直连的网关Gn。
网络层 如何获取IP地址
主机如何获取IP地址 主机获取IP地址:
  • 硬编码:自己设置静态的IP设置
  • DHCP:动态主机配置(Dynamic Host Configuration Protocol)
    ??当主机连接网络时,允许主机从网络服务器动态获取IP地址。
DHCP 当一台主机加入网络时,从子网中的DHCP服务器获取IP地址。
  1. 发现阶段,即DHCP客户机寻找DHCP服务器的阶段。DHCP客户机以广播方式(因为DHCP服务器的IP地址对于客户机来说是未知的)发送DHCP discover发现信息来寻找DHCP服务器,即向地址255.255.255.255发送特定的广播信息。网络上每一台安装了TCP/IP协议的主机都会接收到这种广播信息,但只有DHCP服务器才会做出响应。
  2. 提供阶段,即DHCP服务器提供IP地址的阶段。在网络中接收到DHCP discover发现信息的DHCP服务器都会做出响应,它从尚未出租的IP地址中挑选一个分配给DHCP客户机,向DHCP客户机发送一个包含出租的IP地址和其他设置的DHCP offer提供信息。
  3. 选择阶段,即DHCP客户机选择某台DHCP服务器提供的IP地址的阶段。如果有多台DHCP服务器向DHCP客户机发来的DHCP offer提供信息,则DHCP客户机只接受第一个收到的DHCP offer提供信息,然后它就以广播方式回答一个DHCP request请求信息,该信息中包含向它所选定的DHCP服务器请求IP地址的内容。
  4. 确认阶段,即DHCP服务器确认所提供的IP地址的阶段。当DHCP服务器收到DHCP客户机回答的DHCP request请求信息之后,它便向DHCP客户机发送一个包含它所提供的IP地址和其他设置的DHCP ack确认信息,告诉DHCP客户机可以使用它所提供的IP地址。然后DHCP客户机便将其TCP/IP协议与网卡绑定,另外,除DHCP客户机选中的服务器外,其他的DHCP服务器都将收回曾提供的IP地址。
  5. 重新登录。以后DHCP客户机每次重新登录网络时,就不需要再发送DHCP discover发现信息了,而是直接发送包含前一次所分配的IP地址的DHCP request请求信息。当DHCP服务器收到这一信息后,它会尝试让DHCP客户机继续使用原来的IP地址,并回答一个DHCP ack确认信息。如果此IP地址已无法再分配给原来的DHCP客户机使用时(比如此IP地址已分配给其它DHCP客户机使用),则DHCP服务器给DHCP客户机回答一个DHCP nack否认信息。当原来的DHCP客户机收到此DHCP nack否认信息后,它就必须重新发送DHCP discover发现信息来请求新的IP地址。
  6. 更新租约。DHCP服务器向DHCP客户机出租的IP地址一般都有一个租借期限,期满后DHCP服务器便会收回出租的IP地址。如果DHCP客户机要延长其IP租约,则必须更新其IP租约。DHCP客户机启动时和IP租约期限过一半时,DHCP客户机都会自动向DHCP服务器发送更新其IP租约的信息。
    计算机网络|计算机网络、网络编程笔记
    文章图片

NAT:网络地址转换(Network Address Translation) 将一些私网IP+端口号 和 某一公网IP+端口号 一一对应,来与外部网络进行通信,通过充分利用端口号,缓解IP需求。
  • 从这个本地网络出去的报文都有着:相同的源IP+不同的端口号
  • 对于外界网络来说,这个本地网络都是一个IP
    • 本地网络有内部地址,改变该内部地址不需要通知外部网络
    • 改变ISP不需要改变本地网络的内部地址
    • 内部地址在外部不可见(保障安全性)
  • 实现方式
    • 发送出去的报文:(源IP(内部的IP),端口号)—> (NAT IP(NAT统一的IP),新端口号)
      • 外部发来的报文的目的地址填写:(NAT IP(NAT统一的IP),新端口号)
    • NAT转换表:记住(源IP(内部的IP),端口号)<—> (NAT IP(NAT统一的IP),新端口号)的转换对
    • 收到的报文:根据NAT转换表,(NAT IP(NAT统一的IP),新端口号)—> (源IP(内部的IP),端口号)
计算机网络|计算机网络、网络编程笔记
文章图片

    推荐阅读