zoukankan      html  css  js  c++  java
  • 网络编程01

    一个连接可以通过客户端 - 服务器端的 IP 和端口唯一确定,这叫做套接字对。

    保留网段

    国际标准组织在 IPv4 地址空间里面,专门划出了一些网段,这些网段不会用做公网上的 IP,而是仅仅保留作内部使用,我们把这些地址称作保留网段。(A、B、C类网络中均划分了一部分网段用作私网 IP https://blog.csdn.net/u011228842/article/details/91558571)

    数据报和字节流

    TCP,又被叫做字节流套接字(Stream Socket),是可靠的、双向连接的通讯串流。

    UDP,数据报套接字(Datagram Socket),优势:速度快。

    一般分别以“SOCK_STREAM”与“SOCK_DGRAM”分别来表示 TCP 和 UDP 套接字。

    总结

    1、网络编程需要牢牢建立起“客户端”和“服务器”模型,两者编程的方法和框架是明显不同的。

    2、TCP 连接是客户端 - 服务器的 IP 和端口四元组唯一确定的,IP 是一台机器在网络世界的唯一标识。

    3、有两种截然不同的传输层协议,面向连接的“数据流”协议 TCP,以及无连接的“数据报”协议 UDP。

    套接字socket

    Tcp三次握手


    1、客户端的协议栈向服务器端发送了 SYN 包,并告诉服务器端当前发送序列号 j,客户端进入 SYNC_SENT 状态;服务器端的协议栈收到这个包之后,和客户端进行 ACK 应答,应答的值为 j+1,表示对 SYN 包 j 的确认,同时服务器也发送一个 SYN 包,告诉客户端当前我的发送序列号为 k,服务器端进入 SYNC_RCVD 状态;

    2、客户端协议栈收到 ACK 之后,使得应用程序从 connect 调用返回,表示客户端到服务器端的单向连接建立成功,客户端的状态为 ESTABLISHED,同时客户端协议栈也会对服务器端的 SYN 包进行应答,应答数据为 k+1;

    3、应答包到达服务器端后,服务器端协议栈使得 accept 阻塞调用返回,这个时候服务器端到客户端的单向连接也建立成功,服务器端也进入 ESTABLISHED 状态。、

    (1. 非阻塞套接字往往配合多路复用机制,达到提高CPU利用率,实现高并发的目的。2. 客户端做bind当然是可以的,但是因为连接请求往往是由客户端主动发起的,所以在客户端做bind显得不那么必要,还要承担端口冲突的风险。)

    发送缓冲区

    发送成功仅仅表示的是数据被拷贝到了发送缓冲区中,并不意味着连接对端已经收到所有的数据。至于什么时候发送到对端的接收缓冲区,或者更进一步说,什么时候被对方应用程序缓冲所接收,对我们而言完全都是不透明的。

    UDP

    UDP 和 TCP 之间最大的区别:

    TCP 是一个面向连接的协议,TCP 在 IP 报文的基础上,增加了诸如重传、确认、有序传输、拥塞控制等能力,通信的双方是在一个确定的上下文中工作的。

    而 UDP 则不同,UDP 没有这样一个确定的上下文,它是一个不可靠的通信协议,没有重传和确认,没有有序控制,也没有拥塞控制。我们可以简单地理解为,在 IP 报文的基础上,UDP 增加的能力有限。UDP 不保证报文的有效传递,不保证报文的有序,也就是说使用 UDP 的时候,我们需要做好丢包、重传、报文组装等工作。

    本地套接字

    本地套接字是一种特殊类型的套接字,和 TCP/UDP 套接字不同。TCP/UDP 即使在本地地址通信,也要走系统网络协议栈,而本地套接字,严格意义上说提供了一种单主机跨进程间调用的手段,减少了协议栈实现的复杂度,效率比 TCP/UDP 套接字都要高许多。类似的 IPC 机制还有 UNIX 管道、共享内存和 RPC 调用等。

    本地字节流套接字和 TCP 服务器端、客户端编程最大的差异就是套接字类型的不同。本地字节流套接字识别服务器不再通过 IP 地址和端口,而是通过本地文件。

    ping命令

    ping 是基于一种叫做 ICMP 的协议开发的,ICMP 又是一种基于 IP 协议的控制协议,翻译为网际控制协议,其报文格式如下图:

    ifconfig,用来显示当前系统中的所有网络设备。

    netstat 可以帮助我们了解当前的网络连接状况

    lsof 的常见用途之一是帮助我们找出在指定的 IP 地址或者端口上打开套接字的进程

    lsof 还有一个非常常见的用途。如果我们启动了一个服务器程序,发现这个服务器需要绑定的端口地址已经被占用,内核报出“该地址已在使用”的出错信息,我们可以使用 lsof 找出正在使用该端口的那个进程。比如下面这个代码,就帮我们找到了使用 8080 端口的那个进程,从而帮助我们定位问题。

    lsof -i :8080

    tcpdump 可以对各种奇怪的环境进行抓包,进而帮我们了解报文,排查问题

  • 相关阅读:
    用户自定义异常
    触发异常
    第一阶段冲刺终
    第一阶段冲刺七
    第一阶段冲刺六
    第一阶段冲刺五
    第一阶段冲刺四
    Sufficient Statistic (充分统计量)
    DAG-GNN: DAG Structure Learning with Graph Neural Networks
    Masked Gradient-Based Causal Structure Learning
  • 原文地址:https://www.cnblogs.com/520lq/p/14642861.html
Copyright © 2011-2022 走看看