首页 > 编程语言 >c# 网络编程(一)网络通信相关知识

c# 网络编程(一)网络通信相关知识

时间:2023-05-03 23:12:50浏览次数:42  
标签:网络通信 协议 c# IP 编程 TCP MAC IP地址 端口号

基础知识

计算机的网络通信可归结为网络中层与层的通信。

网络分层:网络应用开发人员一般将网络分为4层:

  • 物理层、数据链路层、
  • 网络层。
  • 传输层。
  • 应用层(最顶层)。

分层并不是在物理上的分层,而是逻辑上的分层。

网络层建立的是主机与主机之间的通信,而传输层则建立了端口与端口之间的通信。这样,一旦确定了主机和端口号之后,你就可以实现程序之间的通信了。

IP地址、端口号

Internet使用IP地址来标识计算机的网络地址,使用端口号来识别不同计算机上的进程,所以通过IP地址+端口号的方式就可以唯一的标识网络上特定计算机的特定进程(应用程序)。

主机用端口号来标识不同的程序(进程),端口号是一个0到65535之间的整数,其中0到1023的端口号已被系统占用,用户只能选择大于1023的端口号来标识程序。

MAC地址

一个主机(电脑手机等)会有一个MAC地址(Madia Access Control Address),也叫物理地址,由网卡决定,他是全球唯一的、固定的。

IP地址可以变换,但MAC地址基本上不会改变。IP间的通信依赖MAC地址。

在局域网中,就可以动态维护一个MAC地址与IP地址的映射关系,根据目的IP地址就可以寻找到机器的MAC地址进行发送 。

DNS 负责域名解析

DNS(domain nname system)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务,即可以通过域名查找IP地址,也可以从IP地址反查找域名。

URL、URI

URL(Uniform Rescource Locator ,统一资源定位符)、URI(Uniform Resource Identifier,统一资源标识符)

URI用字符串表示某一互联网资源,而URL表示资源的地点即互联网上所处的位置,可见URL是URI的子集。通常URI和URL是一样的,不用刻意做区分。

一个URI示例:

https://www.dedao.cn/search/result?q=莫言

主机间进程(应用程序)通信

主机A中的程序和主机B中的程序只有只有使用了相同的协议,他们之间才可以正常通信。

有了地址,有了通信协议,我们就可以使用嵌套字(Socket)来进行通信了。两个程序之间的数据传输是通过嵌套字来完成的。我们可以将嵌套字理解为网络进程通信过程中所使用的一段缓冲区。

网络编程是为了实现通过网络协议,使本地计算机可以直接或间接地与其他计算机进行通信。目前(2014年)较为流行的网络编程模型是客户/服务器(Client/Server)结构。在通信的双方中,一方作为服务器等待客户提出请求并给予响应,另一方客户端在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。

与HTTP协议关系密切的协议:IP、TCP、DNS

负责传输的IP协议

按层次分,IP(Internet protocol)网际协议位于网络层。IP协议的作用就是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件,其中两个重要的条件是IP地址和MAC地址(Madia Access Control Address)。

IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可以变换,但MAC地址基本上不会改变。IP间的通信依赖MAC地址。

在网络上,通信的双方在同一局域网(LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时,会采用ARP协议(Address Resolution Protocol)。ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。在到达通信目标前的中转过程中,那些计算机和路由器等网络设备只能获悉很粗略的传输路线。这种机制称为路由选择,有点像快递公司的送货过程。无论哪台计算机、哪台网络设备,他们都无法全面掌握互联网中的细节。

负责域名解析的DNS服务

DNS(domain nname system)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务,即可以通过域名查找IP地址,也可以从IP地址反查找域名。

确保可靠性的TCP协议

按层次分,TCP协议位于传输层,提供可靠的字节流服务。所谓的字节流服务是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够TCP协议能够确认数据最终是否送到到对方。

img

img

TCP/IP 协议族

TCP/IP是互联网相关的各类协议族的总称。所以,通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的。而HTTP属于它内部的一个子集。

特点

TCP(transmission control protocol,传输控制协议)是一种面向连接的保证可靠传输的(传输层)协议,通过TCP传输,得到的是一个按顺序写的、无差错的数据流。主要特点:

  • 向应用程序提供面向连接的服务,两个需要通过TCP进行数据传输的应用进程之间首先必须建立一个TCP连接,并且在数据传输完成后要释放连接。
  • 提供全双工数据传输服务,只要建立了TCP连接,就能在两个应用进程之间进行双向的数据传输服务,但这种传输只是端到端,不支持多播和广播。
  • 提供面向字节流的服务,两个建立了TCP连接的应所进程之间交换的是字节流。发送进程以字节流形式发送数据,接受进程也把数据作为字节流来接受。端到端之间不保留数据记录的边界,即在传输层面上不存在数据记录的概念。

TCP的工作过程:

  1. 连接的建立:就是“发送一个校检包给对方然后互相确认”的过程。只有双方都接收到确认信号后,连接才能建立起来。 通信双方“建路”互通。
  2. 传输数据:利用TCP传输数据时,数据是以字节流的形式存在的。客户端与服务器端建立连接后,发送方首先要将发送的数据转化为字节流,然后才能将它发送给对方。发送数据时,可以通过程序将数据流不断地写入TCP 的发送缓冲区中。然后,TCP会自动从发送缓冲区中提取一定量的数据,将其组成TCP报文段发送到ip层,再通过IP层(网络层)的网络接口发送出去。 接收端从IP层接收到TCP报文段后,会将其暂时保存在接收缓冲区中,然后通过程序依次读取接收缓冲区中的数据,从而达到相互通信的目的。 客户端程序需使用write方法将数据写入发送端的缓冲区中,然后服务器端(接收端)使用read方法从其自己的缓冲区中读取数据。概括起来,TCP传输就是“对数据的读、写操作”。
  3. 断开连接:略。

UDP/IP 用户数据报协议

UDP(user data protocol,用户数据报协议)是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址和目的地地址,他在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间和内容的正确性都是不能被保证的。因此UDP是一种非常简单的协议,在网络层的基础上实现了应用进程之间端到端的通信。特点如下:

  • UDP是一种无连接协议,传输数据之前信源和信宿不需要建立连接,因此不存在连接建立的时延。在信源端,UDP传送数据的速度仅受应用程序生成数据的速度、计算机的能力和传输宽带的限制。在信宿端,UDP把每个数据报放在队列中,应用程序每次从队列中读取一个数据报。

  • 由于传输数据不需要建立连接,也就不需要维护连接,包括收发状态等。这样一台服务器可以同时向多个客户机发送相同的数据,例如实现多播。

  • UDP数据报的首部很短,只有8字节,相对于TCP首部的20字节,开销小很多。

  • 吞吐量不受流量控制算法的调节,只受应用软件生成数据的速率、传输宽带、信源和信宿主机性能的限制。

套接字 Socket。

传输层底层实现:socket。socket并不是一个实实在在的东西,而是运输层抽象出来的一个对象。

不同的运输层协议对socket有不同的定义方式。在UDP协议中,使用目标IP+目标端口号来定义一个socket;在TCP中使用目标IP+目标端口号+源IP+源端口号来定义一个socket。我们只需要在运输层报文的头部附加上这些信息,目标主机就会知道我们要发送给哪个socket,对应监听该socket的进程就可获得信息。

.NET中,System.Net.Socket命名空间

该类封装了为进行网络通信而设计的一组公共函数。在 .NET中,System.Net.Socket命名空间为开发人员提供了开发基于Socket类的网络通信程序的一些类,包括Socket类、TcpClient、TcpListener类和UdpClient类,如果开发基于TCP/IP的网络通信程序,可以使用TcpClient、TcpListener类和UdpClient类, 使用上且比较简单;如果为了提高效率或者采用其他网络通信协议,可以采用Socket类。

EndPoint类用于表示网络地址,是一个抽象类。


相关参考:

  • 《Learaning heard c# 学习笔记》

更新于:2023-05-03

标签:网络通信,协议,c#,IP,编程,TCP,MAC,IP地址,端口号
From: https://www.cnblogs.com/idasheng/p/17369873.html

相关文章

  • docker的nginx的nginx.conf文件复制到主机
    要将Docker容器中的Nginx配置文件复制到主机上,可以使用dockercp命令完成。以下是具体的步骤:执行以下命令,在运行中的Nginx容器中复制/etc/nginx/nginx.conf文件到主机的某个目录中(例如,当前目录中的nginx.conf文件):dockercp<nginx-container-name>:/etc/nginx/ng......
  • NC15557 连续区间的最大公约数
    题目链接题目题目描述给一个数列共n(n<=100,000)个数,a1,a2,...,an.(0<=ai<=1000,000,000).有q(q<=100,000)个询问。每个询问为l,r(1<=l<=r<=n).求gcd(al,al+1,...,ar).再求区间[l,r]的子区间中(l<=l'<=r'<=r)满足gcd(al,al+1,...,ar)=gcd(al',al'+1,...ar�......
  • record 关键字
    1.简介record关键字会为类自动生成get,set,toString,equals方法,不用在手动创建模板类.2.使用recordEmployee(Stringname,intid){} publicclassBasicRecord{publicstaticvoidmain(String[]args){varbob=newEmployee("Bob",11);......
  • c定时执行任务
    由一个C定时执行任务的程序引发的思考程序这里使用C写了个定时执行的程序,见a.c//a.c#include<stdio.h>#include<pthread.h>#include<signal.h>#include<stdlib.h>#include<unistd.h>void*send_signal_every_second(void*args){while(1){kill(getpid()......
  • C++中的构造析构函数—2—虚析构函数
    1.构造函数不能定义为虚函数,每个对象的虚函数表指针是在构造函数中初始化的,因为构造函数没执行完,所以虚函数表指针还没初始化好。而析构函数可以定义为虚函数,也必须要定义为虚函数,否则在析构上无法体现出多态,导致子类的析构函数不会被调用,可能导致内存泄漏等风险。2.实验:#inc......
  • 基于.NetCore开发博客项目 StarBlog - (27) 使用JWT保护接口
    前言这是StarBlog系列在2023年的第二篇更新......
  • 【Docker】网络管理
    一、容器默认网络通信Usage:dockerd[OPTIONS]Options:--iccEnableinter-containercommunication(defaulttrue)--icc=false可以禁用容器间网络通信 Dokcer默认使用bridge模式,服务安装后会默认生成一个名为docker0......
  • Tomcat7安装基于jdk 1.7环境
    这篇文章着重讲解tomcat7的安装,首先需要下载tomcat包和相应的jdk,如果你的系统是32位,那么下载x86的jdk,如果是64位的系统,那么下载X64的JDK。tomcat7安装1、查看系统版本 #uname–a//是64位系统,那么我们选择64位的JDKLinux2.6.32-71.el6.x86_64#1SMPFriMay2003......
  • Tomcat7安装基于jdk 1.7环境
    这篇文章着重讲解tomcat7的安装,首先需要下载tomcat包和相应的jdk,如果你的系统是32位,那么下载x86的jdk,如果是64位的系统,那么下载X64的JDK。tomcat7安装1、查看系统版本 #uname–a//是64位系统,那么我们选择64位的JDKLinux2.6.32-71.el6.x86_64#1SMPFriMay2003......
  • Tomcat7安装基于jdk 1.7环境
    这篇文章着重讲解tomcat7的安装,首先需要下载tomcat包和相应的jdk,如果你的系统是32位,那么下载x86的jdk,如果是64位的系统,那么下载X64的JDK。tomcat7安装1、查看系统版本 #uname–a//是64位系统,那么我们选择64位的JDKLinux2.6.32-71.el6.x86_64#1SMPFriMay2003......