首页 > 其他分享 >TCP/IP协议族面面观

TCP/IP协议族面面观

时间:2023-10-27 12:00:24浏览次数:46  
标签:buffer IP 面面观 TCP System using Net

TCP/IP协议族介绍及在C#中的使用

什么是TCP/IP协议族?

TCP/IP协议族是互联网最基本的网络协议族,它定义了互联网上设备之间进行通信的规范。TCP/IP协议族由多个协议组成,每个协议都有不同的功能和用途,下面我们将介绍其中一些常用的协议。

TCP/IP协议族中的常用协议

1. IP协议

Internet协议(IP)是TCP/IP协议族的核心协议之一,它负责定义互联网上设备的寻址和路由。IP协议的作用是将数据包从源主机传输到目标主机。在C#中,我们可以使用System.Net.IPAddress类来表示IP地址,使用System.Net.Sockets.Socket类来进行IP通信。

下面是一个使用TCP/IP协议进行通信的示例代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        // 目标主机的IP地址和端口号
        string serverIP = "127.0.0.1";
        int serverPort = 8888;

        // 创建套接字并连接到服务器
        Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        clientSocket.Connect(new IPEndPoint(IPAddress.Parse(serverIP), serverPort));

        // 发送数据
        string message = "Hello, server!";
        byte[] data = Encoding.UTF8.GetBytes(message);
        clientSocket.Send(data);

        // 接收服务器的响应
        byte[] buffer = new byte[1024];
        int bytesRead = clientSocket.Receive(buffer);
        string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);

        // 打印服务器的响应
        Console.WriteLine("Server response: " + response);

        // 关闭套接字
        clientSocket.Close();
    }
}

2. ICMP协议

互联网控制消息协议(ICMP)用于在IP网络上传递错误消息和操作信息。它常被用于网络故障排查和网络测量。在C#中,我们可以使用System.Net.NetworkInformation.Ping类来执行ICMP操作,例如检查主机的可达性。

下面是一个使用ICMP协议进行Ping操作的示例代码:

using System;
using System.Net.NetworkInformation;

class Program
{
    static void Main()
    {
        // 目标主机的IP地址
        string host = "www.example.com";

        // 创建Ping对象
        Ping ping = new Ping();

        // 发送Ping请求并等待响应
        PingReply reply = ping.Send(host);

        // 打印Ping结果
        Console.WriteLine("Ping status: " + reply.Status);
        Console.WriteLine("Roundtrip time: " + reply.RoundtripTime + "ms");
    }
}

3. TCP协议

传输控制协议(TCP)提供可靠的、面向连接的通信。TCP将数据分割成小的数据段,并在网络上发送。它还提供了流量控制和拥塞控制机制。在C#中,我们可以使用System.Net.Sockets.TcpClientSystem.Net.Sockets.TcpListener类来创建TCP客户端和服务器。

下面是一个简单的TCP服务器和客户端的示例代码:

// 服务器端

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        // 监听的端口号
        int serverPort = 8888;

        // 创建TcpListener对象
        TcpListener server = new TcpListener(IPAddress.Any, serverPort);

        // 开始监听
        server.Start();

        Console.WriteLine("Server started. Waiting for client...");

        // 接受客户端连接
        TcpClient client = server.AcceptTcpClient();
        Console.WriteLine("Client connected.");

        // 获取客户端的网络流
        NetworkStream stream = client.GetStream();

        // 接收客户端的消息
        byte[] buffer = new byte[1024];
        int bytesRead = stream.Read(buffer, 0, buffer.Length);
        string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
        Console.WriteLine("Received message: " + message);

        // 发送响应给客户端
        string response = "Hello, client!";
        byte[] data = Encoding.UTF8.GetBytes(response);
        stream.Write(data, 0, data.Length);
        Console.WriteLine("Response sent.");

        // 关闭连接
        client.Close();
        server.Stop();
    }
}
// 客户端

using System;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        // 服务器的IP地址和端口号
        string serverIP = "127.0.0.1";
        int serverPort = 8888;

        // 创建TcpClient对象并连接到服务器
        using (TcpClient client = new TcpClient(serverIP, serverPort))
        {
            // 获取网络流
            NetworkStream stream = client.GetStream();

            // 将要发送的消息转换为字节数组
            string message = "Hello, server!";
            byte[] data = Encoding.UTF8.GetBytes(message);

            // 发送数据
            stream.Write(data, 0, data.Length);

            // 接收服务器的响应
            byte[] buffer = new byte[1024];
            int bytesRead = stream.Read(buffer, 0, buffer.Length);
            string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);

            // 打印服务器的响应
            Console.WriteLine("Server response: " + response);
        }
    }
}

4. UDP协议

用户数据报协议(UDP)提供不可靠的、无连接的通信。UDP发送数据报给目标主机,而无需建立连接。它通常用于实时应用程序,如音频和视频流。在C#中,我们可以使用System.Net.Sockets.UdpClient类来创建UDP客户端和服务器。

下面是一个简单的UDP服务器和客户端的示例代码:

// 服务器端

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        // 监听的端口号
        int serverPort = 8888;

        // 创建UdpClient对象
        UdpClient server = new UdpClient(serverPort);

        Console.WriteLine("Server started. Waiting for client...");

        // 接收客户端消息
        IPEndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);
        byte[] buffer = server.Receive(ref clientEP);
        string message = Encoding.UTF8.GetString(buffer);
        Console.WriteLine("Received message from client: " + message);

        // 发送响应给客户端
        string response = "Hello, client!";
        byte[] data = Encoding.UTF8.GetBytes(response);
        server.Send(data, data.Length, clientEP);
        Console.WriteLine("Response sent.");

        // 关闭服务器
        server.Close();
    }
}
// 客户端

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        // 服务器的IP地址和端口号
        string serverIP = "127.0.0.1";
        int serverPort = 8888;

        // 创建UdpClient对象
        UdpClient client = new UdpClient();

        // 将要发送的消息转换为字节数组
        string message = "Hello, server!";
        byte[] data = Encoding.UTF8.GetBytes(message);

        // 发送数据
        client.Send(data, data.Length, serverIP, serverPort);
        Console.WriteLine("Message sent to server.");

        // 接收服务器的响应
        IPEndPoint serverEP = new IPEndPoint(IPAddress.Any, 0);
        byte[] buffer = client.Receive(ref serverEP);
        string response = Encoding.UTF8.GetString(buffer);
        Console.WriteLine("Server response: " + response);

        // 关闭客户端
        client.Close();
    }
}

以上只是TCP/IP协议族中的一部分协议。对于其他协议,C#程序员可以通过使用各种第三方库或者自行实现协议相关的类和方法来实现相应的功能。在实际开发中,请根据具体需求选择适合的协议和工具。

标签:buffer,IP,面面观,TCP,System,using,Net
From: https://www.cnblogs.com/jack-jiang0/p/17791960.html

相关文章

  • CentOS7系统放行TCP/UDP端口教程
    在使用CentOS7操作系统时,您需要放行某些端口,以便应用程序能够正常运行。下面是如何放行TCP/UDP端口的步骤。步骤1:SSH连接服务器使用SSH方式连接服务器,如果您不知道如何SSH连接服务器,可以查看该教程:SSH远程连接Linux服务器教程步骤2:确定要放行的端口在放行端口之前,您需要确定要......
  • 在JavaScript中创建多行字符串
    内容来自DOChttps://q.houxu6.top/?s=在JavaScript中创建多行字符串在JavaScript中,等效的代码如下:consttext=`ThisIsAMultilineString`;更新:ECMAScript6(ES6)引入了一种新的字面量类型,即模板字面量。它们具有许多功能,包括变量插值等等,但最重要的是对于这个问题,它......
  • Python给你一个字符串,你怎么判断是不是ipv4地址?手写这段代码,并写出测试用例【杭州多测
    ipv4地址的格式:(1~255).(0 ~255).(0 ~255).(0 ~255)1.正则表达式importredefcheck_ip(one_str):compile_ip=re.compile('^(([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$')ifcompile_ip.match(one_str):......
  • 分布式链路追踪系统zipkin【杭州多测师_王sir】
    一、部署zipkin环境的方式==》1.docker  2、java-jar   3、运行源码二、分别可以在Linux系统和Windows系统里面运行zipkin三、在地址栏输入:http://127.0.0.1:9411四、zipkin的流程图由上图可以看出,应用的代码(User Code)发起 Http Get 请求(请求路径 /foo),经过 Zipkin......
  • iptables规则补充
    iptables规则小结1.设置默认规则为ACCEPTiptables-PINPUTACCEPTiptables-PFORWARDACCEPTiptables-POUTPUTACCEPT2.iptables-S获得完整的规范#iptables-S(snip)-ADOCKER-d172.17.0.2/32-ptcp-mtcp--dport80-jACCEPT(snip)将-A转换为-D并将......
  • 给google浏览器配独立ip
     参数为:--proxy-server="127.0.0.1:1234"google浏览器中的属性: 类似如下:C:\ProgramFiles\Google\Chrome\Application\chrome.exe"--user-data-dir=D:\chrome\102--proxy-server="127.0.0.1:1234"......
  • P8865 [NOIP2022] 种花 题解
    前言去年多测不清空导致即便CCF放过了我的\(O(n^2m)\)的代码但依然挂成了\(0pts\)。当时看清空数组后能过CCF数据就没再管。时隔\(1\)年,重做这道题写了\(O(nm)\)的正解,终于完成了当年的心愿。\(O(n^2m)\)思路想到计算方案的话可以维护两个数组\(c1_{i,j}\)表......
  • NOIP2023模拟3联测24-博弈树
    NOIP2023模拟3联测24-博弈树目录NOIP2023模拟3联测24-博弈树题目大意思路code题目大意\(Alice\)和\(Bob\)又开始玩游戏了:给定一颗\(n\)个节点的树,\(Alice\)和\(Bob\)随机选择一个节点作为起点放上棋子,由Alice先手。轮到一方后可以将这颗棋子移动到树上任意一点,每次......
  • NOIP 2020
    NOIP2020xjb乱做时间:7:30~9:50分数:100+80+0+40T1[NOIP2020]排水系统根据题目所给信息有若干点没有出度有若干点没有入度且图不成环一眼拓扑直接做就可以了(感觉应该不会炸longlong罢但为了保险起见仍然用的__int128)#include<bits/stdc++.h>usingnamespacest......
  • P4678 [BalticOI 2005] Bus Trip 题解
    P4678[BalticOI2005]BusTrip题解(RE:题解再改造!!)贴码#include<bits/stdc++.h>#defineMAXN500010usingnamespacestd;//ifstreamis("trip.in",ios::in);//ofstreamos("trip.out",ios::out);//#definecinis//#definecoutosintn,m,p,t,tote......