当前位置: 首页 > news >正文

网站建设课程网页游戏传奇开服表

网站建设课程,网页游戏传奇开服表,网站内容有哪些,北京城乡建设和住房门户网站很抱歉#xff0c;我之前写好的UDP与TCP文章不小心被删了#xff0c;所以#xff0c;这篇文章只有一半#xff0c;后面我会尽快补全。 在完成HTTPS的学习后#xff0c;我们就完成了应用层的所有讲解#xff0c;下面我们开始讲解传输层#xff0c;这一层常用的协议为TCP…很抱歉我之前写好的UDP与TCP文章不小心被删了所以这篇文章只有一半后面我会尽快补全。 在完成HTTPS的学习后我们就完成了应用层的所有讲解下面我们开始讲解传输层这一层常用的协议为TCP和UDP。 一、再谈端口号 1.端口号 端口号(port)标识了一个主机上进行通信的不同的应用程序。 如图所示在一个机器上运行着许多进程每个进程使用的协议都不一样比如FTPSSHSMTPHTTPFTP等。 正是因为每一个进程都有自己的端口号如图中TCP21TCP22这些后面的数字就是端口号当发来的数据从网络中传输到应用层后操作系统就能根据端口号将数据交给对应的进程。 2.五元组 TCP/IP协议是传输数据常用的协议它会用 “源IP”、“源端口号”、“目的IP”、“目的端口号”、“协议号” 这样一个五元组来标识一个通信。 如下图所示客户端A打开了两个浏览器页面可认为是两个进程向服务器分别发送数据1和数据2。所以在这两份数据的五元组中源IP地址都是客户端A的IP地址目标IP地址都是服务器的IP地址源端口号分别是2001和2002它们能标识这两个进程目标端口号都是服务端的HTTP进程HTTP使用的端口号是80。 客户端B也打开一个浏览器页面(可认为是一个进程)向服务器发送的数据3。所以在这份数据的五元组中源IP地址就是客户端B的IP地址目标IP是服务端的IP地址源端口号是这个页面进程的端口号目标端口号是服务器HTTP进程的端口号80。 协议号是通信协议的编号指定的协议号可以标识一种协议比如6号就标识TCP协议。 IP地址属于IP协议的内容IP协议属于网络层在传输层处不做讨论。 3.端口号划分 在前面编写套接字代码的时候端口号的类型是uint16_t本质是一个16位的无符号整数。由于这个整数的最大值是65535所以端口号的范围是0~65535。 这些端口号可以分为知名端口号和操作系统动态分配的端口号。 1知名端口号 0~1023范围内的端口号叫做知名端口号这些端口号常被固定的服务绑定如HTTP、FTP、SSH等这些广为使用的应用层协议他们的端口号都是固定的。由于应用层协议本质上是进程在使用所以在这里应用层协议、进程可以看作是等价的。 可以这样理解110对应的是报警电话120对应的是急救电话119是火警电话这些号码已经跟这些公共服务强绑定了。这些放在端口号上也一样0~1023这些端口号都有对应的协议不能随便更改就像报警电话不会随便更改一样。所以我们自己写程序时要避开0~1023这些知名端口号。 下面是一些服务的端口号 服务 端口号 SSH 22 FTP 21 TELNET 23 HTTP 80 HTTPS 443 在Linux机器中有一个文件/etc/services它存储了所有具体端口号对应的服务协议。我截取了该文件的一部分可以清楚地看到http的端口号是80。 2操作系统动态分配的端口号 剩下的1024~65535这些端口号就可以由我们指定去绑定某个进程比如我们之前使用的8080、8081、8082这些。 除了自己用bind函数显式绑定操作系统还可以自动从这些端口号中选择一个分配给某个进程。比如说我们之前写的客户端的套接字就并没有使用bind绑定端口号在调用sendto函数时操作系统就会自己从1024~65535中随机指定一个端口号绑定。 3端口号与进程之间的关系 由于端口号是标识一个进程的标识符所以根据一个端口号必须找到一个唯一的进程。 换句话说一个端口号不能被多个进程绑定。 因为一个进程绑定多个端口号并不破坏一个端口号必须找到一个唯一的进程的特性。 所以一个进程可以绑定多个端口号。 4.一些Linux指令 1netstat netstat指令前面已经用过好多次。 语法netstat[选项]例netstat -lntp 功能可用于查看当前机器的网络状态。 常用选项 n 拒绝显示别名能显示数字的全部转化成数字l 仅列出有在 Listen (监听) 的服務状态p 显示建立相关链接的程序名t (tcp)仅显示tcp相关选项u (udp)仅显示udp相关选项a (all)显示所有选项默认不显示LISTEN相关 2pidof 还有一个指令pidof使用起来也非常的方便。 语法pidof[进程名]例pidof server 功能得到进程名对应的pid值。 我们之前查看进程的pid时总需要用使用ps ajx查看所有进程还要自己找对应的进程。现在直接使用pidof就能返回进程的pid。 还有我们如果想对进程进行处理往往都需要它的pidpidof与其他指令异同使用会很方便。我以终止进程为例。 我们的httpserver还在运行想中止它我们可以输入pidof httpserver | xargs kill -9其中xargs表示把管道传送过来的数据追加到后面的语句中。这样整个语句就变为kill -9 pid从而终止进程。 二、UDP 1.协议格式 下图就是UDP协议的格式前八个字节属于协议报头之后的是有效载荷。 UDP协议的前八个字节作为报头64个比特位。其中这八个字节的前16位0-15存放的是源端口号第16~31位存放目的端口号32~47位存放的是UDP的长度48~64位存放的是UDP校验和。 16位源端口号表示发送端(客户端)的端口号。16位目的端口号表示接收端(服务端)的端口号。16位UDP长度整个UDP数据段(报文)的长度包括报头和有效载荷UDP数据段最大64KB。16位校验和由操作系统进行校验如果发送方和接收方的校验和不一致说明出错就会丢弃整个UDP数据段。 UDP数据段最长不能超过64KB所以如果传输的数据超过了64KB就需要用户在应用层手动将数据分成多个大小小于等于64KB的数据包并进行多次发送在接收端用户也需要手动将各分包重新拼装。 2.解包和分用 解包的最关键问题在于如何把报头和有效载荷进行分离而分用最关键的在于计算机收到的信息怎么传递给需要的进程。 1解包 UDP协议是传输层协议由操作系统维护而Linux操作系统又是由C语言写的所以UDP的报头一定会在操作系统中有自己的结构化数据我们如果自己写一个结构体描述差不多就是这样 struct udp_hdr {uint16_t src_port;//16位源端口号uint16_t dest_port;//16位目的端口号uint16_t length;//16位UDP长度uint16_t check;//16位UDP校验和 };当然将各变量改为unsigned int src_port:16;这样的结构也可以。 以C语言的知识理解报头与有效数据的分离我们可以认为当计算机接收UDP数据时该数据会先放在操作系统的已创建的内核缓冲区内最大为64KB。然后创建一个hdr指针指向UDP报头起始位置再再偏移报头字节数(sizeof(udp_hdr))构建一个start指针指向内核中有效载荷的起始位置。最后根据报头的结构化数据将数据将各个数据包括正文内容拷贝到内存这样就能实现了分离。 上面过程的伪代码 char* hdr malloc(XXX);//操作系统创建内核缓冲区 char* start hdr sizeof(struct udr_hdr);//指向有效载荷 strcpy(start,buffer,len);//将用户缓冲区中数据复制到内核缓冲区有效载荷处。 (struct udp_hdr*)hdr-src_port xxx;//赋值源端口 (struct udp_hdr*)hdr-dest_port xxx;//赋值源端口 (struct udp_hdr*)hdr-length xxx;//赋值源端口 (struct udp_hdr*)hdr-check xxx;//赋值源端口 2分用 分用时操作系统中已经维护了一个哈希表使用绑定的端口号作为key值就能直接找到这个进程将有效载荷交给进程即可。所以进程只要使用网络就一定要绑定端口号不管是否使用bind显式绑定这个绑定的过程本质上就是将数据插入哈希表。 3.特点 UDP协议有以下特点 1无连接只需要指定目的IP和目的端口就可以直接进行传输不需要建立连接。 2不可靠没有确认机制没有重传机制如果因为网络故障该数据段无法发到对方UDP协议层也不会给应用层返回任何错误信息。 UDP发送数据的方式就像发邮件发送者只管发出去至于对方能不能收到完全不关心。 3面向数据报不能够灵活控制读写数据的次数和数量。 应用层交给UDP多长的报文UDP原样发送既不拆分也不合并。UDP发送数据段时一次性将内核缓冲区中的数据全部发送出去。接收端会一次性接收发送端发送的所有数据不能分多次接收。 比如快递你发快递只能一个一个发不能先发半个然后再发半个。收快递也是不能先收半个然后再收半个只能一个个完整的快递进行收发。 4.TCP缓冲区 我需要先解释TCP的缓冲区然后UDP的缓冲区我们就更好理解了。 还记得之前用过的send/sendto、recv/recvfrom这样的的接口吗这些系统调用直接就能把数据发出去了 结论当然是否定的。系统调用的工作在操作系统和用户应用的界限之间而在网络的分层模型中数据会一层一层向下传递并在物理层发出所以这些系统调用的任务一定是从应用层将数据向操作系统传递。 在TCP协议中操作系统会为通信双方各自维护一个发送缓冲区一个接收缓冲区。用户层在调用send/sendto函数之后操作系统会自动对需要发送的内容拼接TCP报头TCP报头的具体内容后面会讲形成数据段然后拷贝到到发送缓冲区中。 同样本主机从对端主机收到数据段后也会先将其放入接收缓冲区中。当用户层读使用recv/recvfrom这样的系统调用时系统调用就会将接收缓冲区内的数据拷贝到应用层中具体点说就是拷贝到接收数据的字符串中。 所以send/sendto、recv/recvfrom本质上是一个拷贝接口它们前者负责将应用层的数据拷贝到发送缓冲区后者负责将数据从接收缓冲区拷贝到应用层。 在两个缓冲区中的数据由TCP的内部代码进行发送和接收用户只负责将数据放入或拿出这两个缓冲区。正是因为数据的传输无需用户参与所以TCP的全名叫做传输控制协议。 而且这两个缓冲区使得通信双方进程在同一时刻既可以发送数据也可以接收数据且互不影响我们称之为全双工。 5.UDP缓冲区 UDP协议与TCP相似只是少了一个发送缓冲区。当客户端使用UDP协议将用户层的数据使用sendto发送的时候数据会被直接拷贝到内核中经过一定处理后立即发出。 在使用UDP协议接收数据时操作系统将发送来的数据存放在接收缓冲区中在适当的时候操作系统会将数据交给用户层。 UDP的信息传输方式也实现了发送和接收数据同时进行和互不干扰也叫做全双工。 6.常见的基于UDP的应用层协议 缩写 全名 NFS 网络文件系统 TFTP 简单文件传输协议 DHCP 动态主机配置协议 BOOT 启动协议(用于无盘设备启动) DNS 域名解析协议 上面这些协议在传输层都是使用的UDP协议其中很多我们天天都在用。 比如说DNS域名解析协议我们之前说url中像baidu.com这样的域名本质上是该网站服务器的IP地址。 当我们在浏览器地址栏中输入某个Web服务器的域名时。用户主机首先用户主机会首先在自己的DNS高速缓存中查找该域名所应的IP地址。 如果没有找到则会使用UDP协议向网络中的某台DNS服务器发送该域名IP地址的查询请求DNS服务器中有域名和IP地映射关系的数据库。当DNS服务器收到DNS查询报文后在其数据库中查询之后将查询的IP地址发送给用户主机。 此时用户主机中的浏览器可以通过Web服务器的IP地址对其进行访问了。 三、TCP TCP全称为 “传输控制协议(Transmission Control Protocol”).它可以对数据的传输进行细致的控制。 1.协议格式 如图所示TCP协议格式包括20位固定长度数据、选项和数据其中前20字节加上选项组成报头。我们在这里不讲解选项的内容你只需要知道这部分不是定长的就可以了。 16位源端口号发送方进程的端口号。16位目的端口号接收方进程的端口号。32位序号和32位确认号: 后面讲。4位首部长度: 表示该TCP报头的长度是一个无符号整数。TCP报头所占字节数首部长度 * 4又因为4比特位的无符号整数最大值为15所以TCP的最大头部长度是15 * 4 60字节。6位标志位标识TCP数据段的类型包括URG、ACK、PSH、RST、SYN和FIN每个都是一个标志位且各自有各自的功能。16位窗口大小表示滑动窗口的大小后面再讲解。16位校验和发送端填充CRC校验。接收端校验不通过, 则认为数据有问题此处的检验和不仅包含TCP首部也包含TCP数据部分。16位紧急指针标识哪部分数据是紧急数据(带外数据)。 TCP协议同样内置于操作系统中它的报头也是一个C语言编写的结构化数据只是结构体中的成员变量大小和类型与UDP不同而已。 struct tcp_hdr {uint32_t src_port:16;uint32_t dest_port:16;uint32_t seq;uint32_t ack_seq;uint32_t header_length:4;...... }; 2.解包和分用 TCP的解包与UDP很相似TCP的报头已经有20字节被固定占用报头的剩余部分是长度不固定的选项。 所以我们先建立一个指针p1指向这20各字节可以通过指针访问这些数据。 在TCP报头中存有首部长度通过首部长度乘以4就得到了报头的字节数头部长度*4 - 20 选项长度此时我们就可以根据选项的长度构建另一个指向选项头部的指针p2即p1后移20字节可以获取选项的内容。 最后根据报头字节数将p1后移构建指针p3获取正文的内容。 最后分用和之前一样根据端口号在哈希表中对应进程即可。 3.缓冲区 TCP缓冲区前面已经说过了操作系统维护了一个发送缓冲区一个接收缓冲区实现了全双工。 什么时候将数据段从发送缓冲区发出去什么时候将数据从接收缓冲区交给应用层 一次从缓冲区发送多少个字节的数据一次接受多少数据 这些全部由内置在操作系统中的TCP协议自行决定。所以说TCP作为传输控制协议对数据的收发完全自主。 4.面向字节流 我们常说TCP面向字节流的这又是什么意思呢 TCP不像UDP那样一次必须发送或者接收一个完整的数据段。TCP发送与接收数据以字节为单位不考虑接收到的数据是不是一个完整的数据段。这些流动的字节像河流一样所以说TCP是面向字节流的。 5.网络协议和协议栈 如下图所示应用层协议本质上就是进程而每个进程都有pid需要使用网络的进程还有一个或多个端口号port操作系统会维护一个哈希表。操作系统会根据所有使用网络的进程构造portpid的键值对存放在哈希表中port是key值pid是value。 在操作系统完成数据段的解包以后会根据TCP协议中的目的port在哈希表中查找对应进程的pid有了pid操作系统就能找到PCB而PCB的文件描述符表中必定有一个fd指向的文件是一个网络套接字。 而套接字本质上也是个文件所以也会存在一个struct file结构体来管理它该结构体中的读写缓冲区其实就是TCP协议的接收和发送缓冲区。 最后将TCP层解包后的有效载荷放入找到的struct file的接收缓冲区中。此时分用中最重要的将数据交给对应进程的任务就完成了应用层就可以根据文件描述符fd用read读取有效载荷(报文)了这就完成了数据的接收。 发送的过程也是一样不过是走了相反的方向。
http://wiki.neutronadmin.com/news/344102/

相关文章:

  • 平面设计鉴赏网站网络推广公司简介
  • 网站内容怎么修改天津做网站外包公司有哪些
  • 网站宣传策划方案营销型网站建设题库
  • 厦门 网站 开发如何装wordpress
  • 网站内链怎么优化html个人主页网页设计代码
  • 建设一个个人网站不需要网站建设设计公司
  • 今天的特大新闻有哪些淄博seo排名
  • 网站后台ftp在哪二手车网站程序
  • 唐山市城乡建设网站网站改版需要注意
  • wordpress站群模板做网店哪些网站比较好
  • 大型网站制作导图怎么做淘宝店网站收录
  • 网站建设怎么解析域名手机版网页设计
  • 建站公司合同模板查手表价格的网站
  • 公共法律服务网站建设总结湖南网站优化服务
  • 网络举报网站乔拓云网站建设
  • pc端网站怎么做自适应推广策略图片
  • 为什么进行网站备案添加了字体为什么wordpress
  • dedecms 网站地图什么是手机网站
  • 长沙建站模板如何查询到某网站开发商
  • 内蒙古通辽网站建设沧州免费建站
  • 怎么选择网站开发深圳代理记账公司前十名
  • 国外网站不需要备案吗金属建材企业网站建设方案
  • 开发 必知 网站企业网站收费标准
  • 怎么做网页 网站制作新浪sae安装wordpress
  • 南宁网站建设哪里有什么软件可以弄排名
  • 玉石电商网站建设方案可信赖的扬中网站建设
  • 微网站开发第三方平台教育机构退费法律规定
  • 国外刺绣图案设计网站wordpress 反广告屏蔽
  • 杭州住房和城乡建设局网站海外搜索推广外贸网站
  • 网站开发人员需要什么技能网站设计服务有哪些