当前位置:   article > 正文

【网络】网络编程入门篇——了解接口,快速上手,带你手搓简易UDP服务器和客户端(简易远端shell、简易群聊功能以及跨平台群聊)_udp server / client 最简单

udp server / client 最简单

在这里插入图片描述

本篇博客由 CSDN@先搞面包再谈爱 原创,转载请标注清楚,请勿抄袭。

前言

本篇主要讲解:

  • 认识端口号, 网络字节序等网络编程中的基本概念;
  • 学习网络相关接口的用法;
  • 能够实现简单的udp客户端/服务器;

如果屏幕前的你对于网络的一些基本概念(比如网络的分层模型、两台主机如何通信、IP地址和MAC地址等等)还不是很了解的话,可以先看看我这篇博客:【网络】网络扫盲篇 ——用简单语言和图解带你入门网络

正式开始

端口号

提个问题,两台主机都有了对方的IP地址,这两台主机就可以进行通信了吗?
答案是不能的,还缺点东西。

缺个端口号。

图解

IP地址在全网中能够标定唯一一台主机。当两台主机通过IP地址发数据的时候,把数据发送到了对方主机就完了吗?并没有。如图:

在这里插入图片描述

两个黑框是网络的各个分层,我就不画了。

说数据发给了对面的主机不太准确的,更准确的来说是发给对面主机的某个进程了。

在这里插入图片描述

当你打开一个浏览器,在浏览器中输入www.baidu.com,这时我们的主机会向百度的主机进行请求,然后百度的主机将其首页的信息发给了我们当前的主机,更准确的说是将其首页给了我们电脑上的某一个进程,而这个进程就是浏览器。

同理,屏幕前的你刷B站的时候,是B站的服务器将视频资源推送给了你手机上的B站客户端APP,而不会推送给其他的APP。

那么上面的图还是有点不准确的,发送数据时,应该也是一个进程发送,接收时是一个进程接收:
在这里插入图片描述

在请求资源的时候是客户端软件帮你请求,让你的主机帮你将请求信息发送给对方的主机,而对方也有一个服务器软件,所有的推送都是这个服务器软件做的,说白了就是客户端进程和服务端进程在通信,所以通信的时候并不是机器在通信,而是最上层的应用在通信,且客户端和服务端都是要处于运行状态的,也就是客户端进程和服务端进程:
在这里插入图片描述

同样的,服务端也可以给客户端发数据。

所以网络通信的本质是进程间通信,将数据在主机间转发仅仅是手段,机器收到之后,需要将数据交付给指定的进程。

但是在交付的时候如何确定是交付给哪一个进程呢?
就是通过端口号。

网络进程会有一个端口号,且该端口号在主机上是唯一的,当收到数据的时候,在传输层的报头会包含数据要发送给指定进程的端口号。

通过IP能够确定一个主机,通过端口号能确定某一个主机中的一个网络进程。所以IP + 端口号就能确定全网中的唯一的一个进程。所以任何一个报文,一定要带上IP和port(端口号),用IP找到目标主机,用port找到目标进程。

端口号简单总结

端口号(port)是传输层协议的内容。

  • 端口号是一个2字节16位的整数;

  • 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;

  • IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;

  • 一个端口号只能被一个进程占用

进程PID和端口号

进程的PID也可以确定一个主机的唯一进程,但是PID和端口号没有半毛钱关系,虽然用PID也可以做到在网络中标识进程,但是PID是进程管理的范畴,若用了PID,那进程管理和网络就会有关联,让两个毫不相关的模块产生关联是没有必要的,二者解耦,更容易维护。

还有一点,并不是所有的进程都需要端口号的,但是所有的进程都是要有PID的,因为不是所有的进程都要作为客户端/服务端,所以只需要给网络进程提供端口号就行。

一个进程可以和多个端口号绑定,意思就是多个端口号都可以指向一个进程。但是一个端口号只能绑定一个进程,不然发送的数据就跑不到指定进程那了。

客户端向服务端发送请求的时候,客户端是源端口号,服务器为目的端口号。
服务端向客户端产生响应的时候,服务器是源端口号,客户端为目的端口号。
意思就是谁发数据谁就是源端口号,谁接收谁就是目的端口号。

套接字(socket)

将IP和端口号结合起来就是套接字,IP又分为源IP和目的IP,端口号也分为源端口号和目的端口号。
{SRC_IP, SRCPORT} 和 {DST_IP 和 DST_PORT}都是套接字。

网络编程又称为套接字编程。我后面说套接字时部分地方就直接说成socket了,屏幕前的你不要看见了不认识。

上手编程

TCP和UDP

上手前得先简单说说这两个东西。

说归说,只是一带而过,后面我会有专门的博客细讲这两个东西。而且本篇只是写简易的UDP服务器和客户端。

认识TCP协议

此处我们先对TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识; 后面我的博客中再详谈TCP。

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流
认识UDP协议

此处也是对UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后面博客再详细讨论.

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报
二者对比
  1. 传输层协议
    TCP和UDP都是传输层的协议。

2.有无连接

TCP有连接,意思是通信前要先和对方建立好连接才能通信,比如说我们打电话的时候,一方打过去,另一方得接住才能说话,不能说刚打过去你就开始说了,那是在和空气说。

UDP无连接,就是通信前不需要通知对方,直接说好了一块发过去,比如说写信,我们发给对方的时候对方是不知道你写了信的,但是到时候自然有人通知TA有信来了。

  1. 可不可靠
      屏幕前的你先不要拿这一点来判断谁好谁坏。TCP和UDP都能够存在说明是都能被接受的,各有各的特色。
      先说点UDP不好的,UDP会出现丢包问题,TCP不会出现。不过现在的网络出现丢包问题概率并不大,即使出现了大部分场景下也是可以容忍的。先不要对UDP产生偏见,等会讲的时候你就知道为啥了。
      二者的可不可靠只是二者的特点。并不是单方的缺点。

TCP比UDP可靠,那么TCP就要做更多的工作,可靠性是要靠大量的编码和数据处理工作来实现的,所以TCP想要保证可靠性就一定会使得其在数据通信时为了可靠性而设计出更多的策略,如面向连接、确认应答、超时重传、流量控制、拥塞控制等机制,而这些机制都要靠TCP协议自己来完成,所以说虽然保证了可靠性,但是也就导致了该协议更复杂,维护起来成本更高。

此时UDP就可以对TCP说:咋俩都是协议,你把自己搞那么累干嘛,丢包就丢包了,心放大点,这都不是事,所以UDP只要把数据交给下层就行了,然后就啥也不用管了。而TCP就得管一大堆事,即TCP更安全,UDP更简单。

  • 但是我们大部分情况下传输层协议用的是TCP。像直播、视频这种数据可以用UDP,比如我们有时候看着直播 / 视频时突然卡一下/没声了/屏幕花了等等问题,就可能是因为传输层用的是UDP协议导致丢包了,但是这样就卡一两秒对整体的观看体验影响不大(足球比赛快要进球的时候卡了当我没说
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/187142
推荐阅读
相关标签