linux网络编程udp服务器和客户端代码编写(echo版本和字典版本)
海底光纤搭卫星90年代马云去美国回来就做了网页互联网最早的是阿帕网用于军工后来不断普及到高校企业计算机是独立的而计算机A的处理结果交给另外一台计算机就需要软盘等硬件需要人的参与一般人的参与就慢了生物信号和光电信号相比肯定慢所以就出现了用线将多台计算机连在一起使用一台计算机作为中转其余计算机的处理结果交给这台中转计算机再由中转计算机交给其它计算机慢慢的需要连接的电脑越来越多一个学校一个企业到一个国家多个国家从局域网到广域网人们看到背后巨大的经济价值铺设海底光纤搭建卫星1.协议协议是一种约定包括硬件级别的协议和软件级别的协议 - 协议分层 - 软件分层层状结构比如继承任何问题都可以通过添加一层软件层来解决问题假设主机A和主机B要通过网络进行通信主机A给主机B发信息首先主机A要能和路由器通信之后要通过网络中的多个中间节点这就引发了几个问题主要还是因为物理距离变长客观事实引发新问题数据如何在两个相邻的设备之间传递网络通信最终转化成无数个相邻数倍通信的问题目标主机定位和路径选择的问题主机B所在的局域网肯定有多个主机主机A发出的报文怎么找到主机B路上有很多节点从而有很多路径要走哪一条选择原则是什么是通信时间越短越好吗数据出现丢失/错乱怎么办使用数据的目的怎么处理数据解决完上面的问题千辛万苦送到了那怎么处理呢网络通信才能解决“人”的问题集线器现在一般都集成在路由器内部OS是C和汇编写的部分协议栈被设计到OS内核中协议栈也是C写的举一个生活中的例子2.网络传输基本流程2.1 局域网通信每台主机在局域网上要有唯一的标识来保证主机的唯一性mac地址48bit硬件固定一张网卡一个mac地址主机A向局域网发送MAC帧局域网内所有主机都能收到类似教室内老师说话所有学生都能听到而MAC帧头部有src和dst也就是谁发的和给谁的信息收到mac帧的主机会判断自己的mac地址和dst是否相同相同则接收主机E不同则丢弃但是存在一个问题如果主机A和其它主机同时发送类似有多个人同时说话听不清这时候发生碰撞碰撞的主机进行休眠一段时间这段时间其它主机就可以发送了重新发送以太网碰撞域任何主机都能进行碰撞检测碰撞避免算法从而维护任意一个时刻只能被一个人使用原子性局域网通信就是基于碰撞检测和碰撞避免不断重试的过程从系统的角度看以太网看作所有主机可以看作线程因为执行发生数据的最终还是落在执行流上共享的资源但需要保护起来也就是临界资源主机A为什么给主机E发数据用户的需求局域网和以太网什么关系还有其它局域网吗令牌环网有一个令牌谁拿到令牌谁就可以发送数据令牌会在主机间轮询需要发送数据在轮到本主机的时候就拿令牌发数据发完释放令牌令牌去下一个主机从系统角度看令牌就是锁局域网就是锁保护的临界资源科学家们根据声音/光的传播需要介质判定太空中也有光传播的介质只不过我们看不到就起了个名字叫以太研究后发现确实没有程序员就把以太拿来命名局域网局域网负责将主机A在数据链路层的数据交给主机B的数据链路层数据来自应用层由用户定制也是协议栈这个名字的来源举一个例子当A和B打电话的时候A和B都以为自己和对方是直接通信但并非如此A的声音作为用户的数据经过用户层、传输层、网络层、数据链路层的逐层封包最后由网卡传输信号达到B所在主机的网卡经过数据链路层、网络层、传输层、应用层逐层解包最后传送给用户B听到来自A的声音但逻辑上认为A和B直接通信每层发出的数据和每层收到的数据是一致的比如传输层可以将发送方传输层以下对传输层数据做的封包和接收方传输层以下解包之后把数据交给传输层看作黑盒操作传输层不管达到解耦就好像打电话时对方说话因为数据传输和处理快到我们感知不到在感官上我们认为和对方直接通信对于网络协议栈的各层来说也是这样的由于下层的封装和解包对于该层是透明的所以发的数据和收的数据一致逻辑上认为层与层之间直接通信对于接收方主机的协议栈各层要解决两个问题报头和有效载荷分离的问题有效载荷向上交付给哪一个协议应用层有HTTPHTTPSDNSDHCP等传输层有TCPUDP等网络层有IPICMPIGMP等数据链路层有ARPRARP等2.2 封装协议本身是一个结构体类型报头就是结构体变量在内存中给此次要传输的数据分配缓冲区首先将要传输的数据拷贝到缓冲区接着是应用层报头传输层报头数据链路层报头报头根据长度是否固定分为固定长度报头和变长的报头而封装报头的本质就是在报文头部拷贝结构体变量那么对于第一个问题报头和有效载荷分离的问题以太网mac帧的长度是固定的而IP/TCP的报头中都有各自首部的长度UDP的报头有总长度UDP报头长度是固定的除了报头就是有效载荷自然能分离对于第二个问题交给上层时交给哪一个协议呢比如以太网mac帧有类型不同的类型表征不同的IP协议当发送方IP数据报交付给数据链路层时肯定会指明是哪个具体的IP协议类似函数调用传参那数据链路层在mac帧中就可以设置相关字段等到接收方将mac帧交给网络层时根据字段值交给对应的网络协议其它层也是类似2.3 IP地址和Mac地址IP侧重点标识公网中唯一一台主机一台主机有两个地址IP和mac举个例子唐僧取经每到一个地方就会说贫僧从东土大唐而来到西天取经但唐僧不知道怎么去因为之前没去过所以就路上挨个问询到车迟国的时候问国王得知下一站是女儿国到了女儿国IP用于定位主机IP提供长远目标是路径选择的依据MAC地址作为当前或者下一跳地址解决的事局域网转发的问题比如身份证号码可以在全国标识你的唯一性但是学号用于在一个范围内标识你的唯一性也是为了解耦如果在学校内随时随地都用身份证号标识学生的唯一性万一身份证号发生重大变更当然一般不会有那么学校的相关系统也要大改而用学号如果身份证号码发生变化学号不变这个标识学生唯一性的key就不会变不会受影响之前看的是在局域网内部的数据传输接下来看一下不同局域网之间的数据传送首先协议栈从上到下会封装发送方的数据在网络层会检测目的IP并不是局域网内部的但直接交给路由器目的mac地址是路由器的mac地址经过网卡传输给路由器路由器也是层状协议不过只到传输层数据链路层解包将数据交给路由器路由器根据目标IP地址判断应该从哪一个接口转发到哪一个局域网接着网络层进行封包交给数据链路层数据链路层根据自身所在局域网也就是令牌环网的协议进行封包接着根据目的mac地址进行传送剩下的就是向上交付的过程可以看到不同局域网的主机是可以通过路由器通信的当然这是比较简单的情况中间只隔了一个路由器其实可以看出来网络层都有路由的功能对于非路由器也就是主机的网络层来说路由的能力是路由给局域网内的主机还是给路由器交由路由器路由到其它局域网到指定主机IP地址在整个路由过程中一直不变有些问题后面修正说法Mac地址一直在变目的IP地址是一种长远目标Mac地址是下一阶段目标目的IP是路径选择的重要依据mac地址是局域网转发的重要依据2.4 端口号端口号是传输层协议的内容是一个2B也就是16位的整数范围是0~655250 ~1023知名端口号比如HTTPFTPSSH等广为使用的应用层协议端口号都是固定的1024~65535OS动态分配的端口号客户端程序的端口号OS就是从这个范围内分配的把数据从主机A传送到主机B是网络通信的手段目的是让用户通信代表用户的是启动起来的程序也就是进程那传输层怎么知道把数据交给哪一个进程呢每个要进行网络通信的进程都会分配端口号一般服务器的端口号是固定的方便客户端发起请求而发起请求的客户端进程会动态分配和释放端口号发起请求的报文内容会携带端口号用于和服务的建立连接端口号pid已经可以标识进程的唯一性为什么还要有端口号一方面不是所有进程都要进行网络通信使用pid如何区分哪些进程要通信哪些进程不需要通信有端口号之后谁拥有端口号谁就需要进行进程间通信另一方面就是解耦一旦pid有什么变化端口号不需要做大的变动也实现专车专用一个是系统概念一个是网络概念端口号是强标识而ip和port的概念类似于10086和内部某个话务员的工号OS如何把收到的数据转发给对应端口进程OS会受到很多份报文最后到达传输层肯定有描述这些报文的数据结构内存中开辟了空间保存报文开辟了空间存储描述报文的数据结构还要管理这些数据结构可以用双向链表同时以端口号作为key建立哈希表索引发给对应端口号进程的报文那如何把网络数据交给对应端口号的进程linux下一切皆文件网卡也是文件有对应的文件描述符fd内容指向struct filefile内部有文件属性以及指针指向对应的文件缓冲区存储的就是收到的网络数据接着把缓冲区的内容拷贝到进程虚拟地址空间用户区开辟的缓冲区进程就拿到了数据有些不准确后续修正IP地址用来标识互联网中唯一一台主机port端口号用来标识主机中唯一一个进程IPPort标识互联网中唯一一个进程通信的本质是两个互联网进程代表人来通信{srcIP, srcPort, dstIP, dstPort}四元组可以用来标识互联网中唯二进程网络通信的本质是进程间通信system V标准只能用于本地进程通信POSIX可以用于本地/网络通信ipport也就是socket套接字3.传输层由于UDP在数据发生丢失时不进行重传所以不需要保存已发送但未应答的数据也没有设立应答机制因为要做的事情少了所以速度快用于对可靠性要求没那么高的场景比如直播视频流等而TCP在数据发生丢失时需要进行重传需要保持已发送但未应答的数据速度稍慢一些现有的场景大部分用的都是TCP比如银行转账等4.网络字节序OS内部的字节序分为大端和小端小端是低权值位字节在低地址“小小小”大端是高权值位字节在低地址和人类视角一致但是所有的机器大小端并不统一假设先发送低地址后发送高地址机器A是小端发的就是44332211接收方主机B拿到之后先拿低地址放在低地址从低地址到高就是44332211假设机器B是大端那收到的就是44332211和发送数据并不一致所以就出现了问题本来这个问题是不存在的但是引入网络通信后就存在了如何解决呢一般网络中发送的都是大端而且一般不需要我们转系统提供的有函数只有极少数情况下才需要我们自己转htonl就是把32位的整数转为大端如果本就是什么都不做否者进行转化5.socket网络编程5.1 概念和接口socket网络编程的设计者也希望支持本地ipc由于socket的设计者既想支持网络通信也想支持本地通信还能支持raw socket网络通信需要ip地址端口号本地通信需要文件路径原始套接字需要其参数参数个数和数量不同接口肯定不能相同接口不同就导致学习成本增加于是就想通过增加一个中间层来统一参数的传递并统一函数名降低学习成本bind传的是struct sockaddr的地址struct sockaddr_in和struct sockaddr_un以及struct sockaddr开始的字段都是16位数据根据传入sockaddr前16位是AF_INET决定是网络通信是AF_UNIX决定是域间通信如果是网络通信定义struct sockaddr_in传参时强转即可内部使用时再强转使用-访问成员其实C的多态估计也是这么设置的sockaddr是基类另外两个是子类点分十进制ip地址和4字节IP地址转化sockfd也就是当前socket绑定的文件描述符flags设为0也就是阻塞读取如果没有数据就阻塞类似scanf其实本身是阻塞在系统调用那ssize_t要么读取到数据0要么读取失败0sendto 第一个参数是要通过哪一个文件描述符进行发送本质是把用户地址空间的内容拷贝到文件描述符对应的缓冲区最后由系统转发第二个参数是发送什么数据数据起始地址第三个是长度第4个位0就是阻塞式发送第4个是发给谁目的主机的socket信息第5个是第四个参数的长度总而言之就是1.发送什么数据buf 2.发给谁dest_addr 3.如何发送 sockfd通过文件描述符进行发送client需要有自己的IP和Port信息但是不能显示bind因为不同客户端是独立的如果显示bind就可能出现冲突比如淘宝和抖音都绑定端口号8080如果淘宝先启动抖音就启动不了端口号只需要具有唯一性即可具体数值不重要client一般会采用随机端口的方式由OS自主选择udo client首次发送数据时OS底层会隐式自动获取随机端口bindPortIPclient需要知道服务端的IP和Port这些信息是内置到client内部的5.2 测试代码echoserver5.2.1 内网测试版本测试结果如果使用127.x.x.x地址可以通信说明客户端和服务端没有问题如果不能通信可能是网络的问题通过查询可以看到127.0.0.1是本地环回地址5.2.2 公网测试版本5.2.2.1 Linux和Linux通信绑定购买云服务器分配的公网ip失败一台主机可能有多个ip地址如果主机装了多个网卡还会增加多个IP地址下面也可以看到多个IP地址因为任何主机都可以连有线/无线根本原因是不同路由器分配多个IP内网IP指本主机局域网IP是指购买云服务器内部有多台主机形成一个局域网局域网IP标识主机在局域网内部的唯一性公网IP在服务器内部是查不到的报文会转发到公网IP测试结果发现客户端发向公网IP的报文发不出去内网和局域网IP都可以如果绑定单一IP地址可以看到只能接收发给绑定IP地址的报文网络发来的网络字节序IP地址-点分十进制字符串格式获取客户端IP和端口号其实我们发的数据都是先到服务器入口IP地址会有防火墙等进行阻拦正常数据都会通过如果要./client 公网IP 8080 也可以通信的话在云服务器的防火墙添加规则UDP8080客户端静态编译可以避免对动态库的依赖把生成的客户端程序通过sz发送到桌面通过社交网络传递多人收到通过rz从桌面获取程序或者拖拽等方式运行客户端程序就可以通信下图是一台centos虚拟机通过公网IP进行通信如果多人收发就可以实现群聊客户端收到数据也会获取发送方的socket信息如果发送方想将数据发送给指定的某个人可以将数据转发给某个用户有唯一标识实现私聊netstat可以查看已经启动的服务打印与网络和通信套接字相关信息-a所有域间/tcp/udp -n 以数字形式 -u UDP -t tcp -p显示进程信息查看udp下面端口号为8080就是自行设定的服务端全零表示任意IP进程名因为长度限制截断查看tcp可以看到刚开始有的PID为-因为权限限制下面sudo提权后可以看到PID我们可以用ssh登录是因为服务器上启动端口为22号的服务我们本质上是和该服务通信所有的操作都会被该服务解释为shell命令返回执行结果5.2.2.2 Linux和Windows通信上面是Linux和Linux机器通信那么Windows呢因为传输层和网络层内嵌于OS核心接口是一致的可能不同OS对一些数据类型进行封装不影响大体使用问题是可能编码方式不同Windows发汉字Linux这边是乱码如果在windows上用qt或者easyx等简单的图形化界面linux收集多个用户的数据和用户信息就可以实现简单的聊天游戏等5.3 DictEchoServer只做了些许改动测试计算机技术和是计算机网络产生于发展的两个最基本的因素A.电话B.通信协议C.线路D.各种协议B用于域名解析的协议是A.HTTPB.DNSC.FTPD.SMTPBICMP报文通过协议来传输A.UDPB.TCPC.IPD.ARPC下列不属于传输层的协议是A.TCPB.UDPC.SMTPD.OSPFCC.应用层以下关于网络协议分层说法不正确的是A.表示层一项重要的工作就是网络标准数据格式的转换B.会话层负责管理传输层以下的分层C.数据链路层是地址管理和路由选择D.传输层管理两个节点之间的数据传输C以下关于网络协议分层理解正确的是多选A.网络协议分层使网络使用更加复杂不利于人们的使用B.OSI模型分为 7层自下而上为物理层数据链路层传输层网络层会话层表示层应用层C.网络协议分层后每层利用紧邻的下层服务更容易记住各层的功能D.人们可以很容易的讨论和学习协议的规范细节传统交换机和路由器分别运行在OSI参考模型的A.数据链路层和网络层B.网络层和传输层C.传输层和数据链路层D.物理层和网络层AOSI参考模型中提供了差错报告网络拓扑结构的功能A.网络层B.传输层C.数据链路层D.物理层C在OSI模型当中,第N层和其上的N1层的关系是A.N层为N1层提供服务B.N1层将从N层接的信息增加一个头部C.N层利用N1层的提供的服务D.N层对N1层没有任何作用AHow long is a MAC address? ( )A.4 bytesB.6 bytesC.8 bytesD.10 bytesB以下有关MAC地址意义和作用描述错误的是A.MAC地址与网络无关B.在网卡出厂时就确定了, 不能修改. MAC地址通常是唯一的C.MAC地址用来识别数据链路层中相连的节点D.一台计算机只能有一个MAC地址D下列IP地址和MAC地址说法错误的是A.IP地址的分配是基于网络拓朴MAC地址的分配是基于制造商B.IP地址应用于OSI第三层即网络层而MAC地址应用在OSI第二层即数据链路层C.数据链路层协议可以通过MAC地址使数据从一个节点传递到相同链路的另一个节点上D.一个MAC地址只能对应唯一一个IP地址DIP数据报的收发方进行跨网投递时发送方需利用ARP协议获取哪些信息A.接收方IP地址的MAC地址B.发送方本网段路由器对应端口的MAC地址C.接收方本网段路由器对应端口的MAC地址D.发送方IP地址的MAC地址BA、B两个网络IP均为静态分配且IP段不同。当一台主机从一个A网络移到B一个网络时以下说法正确的是A.必须改变它的IP地址和MAC地址B.必须改变它的IP地址但不需改动MAC地址C.必须改变它的MAC地址但不需改动IP地址D.MAC地址、IP地址都不需改动BOSI的哪一层通常同时使用报头和报尾进行封装A.网络B.传输层C.数据链路层D.表示层C

相关新闻

最新新闻

日新闻

周新闻

月新闻