网络编程(更新中)

软件开发架构

C/S架构

主从式架构 (英语:Client–server model) 也称客户端-服务器(Client/Server)架构C/S架构,是一种网络架构,它把客户端 (Client) (通常是一个采用图形用户界面的程序)与服务器 (Server) 区分开来。每一个客户端软件的实例都可以向一个服务器或应用程序服务器发出请求。

B/S架构

浏览器-服务器(Browser/Server)结构,简称B/S结构,与C/S结构不同,其客户端不需要安装专门的软件,只需要浏览器即可,浏览器通过Web服务器与数据库进行交互,可以方便的在不同平台下工作;服务器端可采用高性能计算机,并安装Oracle、Sybase、Informix等大型数据库。B/S结构简化了客户端的工作,它是随着Internet技术兴起而产生的,对C/S技术的改进,但该结构下服务器端的工作较重,对服务器的性能要求更高。

网络基础

IP地址

互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(英语:IP Address),是分配给网络上使用网际协议(英语:Internet Protocol, IP)的设备的数字标签。常见的IP地址分为IPv4与IPv6两大类。

IPV4地址

IP地址由32位二进制数组成,为便于使用,常以XXX.XXX.XXX.XXX形式表现,每组XXX代表小于或等于255的10进制数。地址可分为A、B、C、D、E五大类,其中E类属于特殊保留地址。

IP地址是唯一的。目前IP技术可能使用的IP地址最多可有4,294,967,296个(即232)。骤看可能觉得很难会用尽,但由于早期编码和分配上的问题,使很多区域的编码实际上被空出或不能使用。加上互联网的普及,使大部分家庭都至少有一部电脑,连同公司的电脑,以及连接网络的各种设备都消耗了大量IPv4地址资源。

随着互联网的快速成长,IPv4的42亿个地址的分配最终于2011年2月3日用尽[1][2]。相应的科研组织已研究出128位的IPv6,其IP地址数量最高可达3.402823669 × 1038个,届时每个人家居中的每件电器,每件对象,甚至地球上每一粒沙子都可以拥有自己的IP地址。

在A类、B类、C类IP地址中,如果主机号是全1,那么这个地址为直接广播地址,它是用来使路由器将一个分组以广播形式发送给特定网络上的所有主机。32位全为1的IP地址“255.255.255.255”为受限广播地址("limited broadcast" destination address),用来将一个分组以广播方式发送给本网络中的所有主机,路由器则阻挡该分组通过,将其广播功能限制在本网内部。

IPV6地址

从IPv4到IPv6最显著的变化就是网络地址的长度。RFC 2373和RFC 2374定义的IPv6地址,就像下面章节所描述的,有128位长;IPv6地址的表达形式,一般采用32个十六进制数。

IPv6中可能的地址有2128≈3.4×1038个,具体数量为340,282,366,920,938,463,463,374,607,431,768,211,456个。也可以想象为1632个,因为32位地址每位可以取16个不同的值(参考组合数学)。

在很多场合,IPv6地址由两个逻辑部分组成:一个64位的网络前缀和一个64位的主机地址,主机地址通常根据物理地址自动生成,叫做EUI-64(或者64-位扩展唯一标识)

IPV6地址表示:

IPv6地址为128位长但通常写作8组每组四个十六进制数的形式。例如:

  • 2001:0db8:85a3:08d3:1319:8a2e:0370:7344

是一个合法的IPv6地址。

如果四个数字都是0,可以被省略。例如:

  • 2001:0db8:85a3:0000:1319:8a2e:0370:7344

等价于

  • 2001:0db8:85a3::1319:8a2e:0370:7344

遵从这些规则,如果因为省略而出现了两个以上的冒号的话,可以压缩为一个,但这种零压缩在地址中只能出现一次。因此:

  • 2001:0DB8:0000:0000:0000:0000:1428:57ab
  • 2001:0DB8:0000:0000:0000::1428:57ab
  • 2001:0DB8:0:0:0:1428:57ab
  • 2001:0DB8:0::0:1428:57ab
  • 2001:0DB8::1428:57ab

都是合法的地址,并且他们是等价的。但

  • 2001::25de::cade

是非法的。(因为这样会使得搞不清楚每个压缩中有几个全零的分组)

同时前导的零可以省略,因此:

  • 2001:0DB8:02de::0e13

等价于

  • 2001:DB8:2de::e13

如果这个地址实际上是IPv4的地址,后32位可以用10进制数表示;因此:

ffff:192.168.89.9等价于::ffff:c0a8:5909,但不等价于::192.168.89.9和::c0a8:5909。
ffff:1.2.3.4格式叫做IPv4映射地址,是不建议使用的。而::1.2.3.4格式叫做IPv4一致地址

IPv4地址可以很容易的转化为IPv6格式。举例来说,如果IPv4的一个地址为135.75.43.52(十六进制为0x874B2B34),它可以被转化为0000:0000:0000:0000:0000:0000:874B:2B34或者::874B:2B34。同时,还可以使用混合符号(IPv4-compatible address),则地址可以为::135.75.43.523。

端口

在电脑网络中,通信端口(英语:port),又称为连接端口接口端口协议端口(protocol port),是一种经由软件创建的服务,在一个电脑操作系统中扮演通信的端点(endpoint)。每个通信端口都会与主机的IP地址及通信协议关联。通信端口以16比特数字来表示,这被称为通信端口编号(port number)。

位于传输层的通信协议通常需要指定端口号,例如在TCP/IP协议族之下的TCP与UDP协议。在应用层中,使用主从式架构的通信协议,在每个通信端口上提供多路复用服务(multiplexing service)。经由公认连接端口号(well-known port numbers),通常可以辨认出这个连接使用的通信协议,其中具代表性的是最基础的1024个公认连接端口号(well-known port numbers),例如telnet协议默认使用23端口来连接,HTTP连接默认使用80端口。

传输层协议,如传输控制协议(TCP)与用户数据报文协议(UDP),在数据包表头中,定义了来源端口号与目的端口号。一个通信端口号使用16位无符号整数(unsigned integer)来表示,其范围介于0与65535之间。在TCP协议中,端口号0是被保留的,不可使用。在UDP协议中,来源端口号是可以选择要不要填上,如果设为0,则代表没有来源端口号。

在操作系统中,一个进程,可以通过internet socket,将它的输入与输出,与一个特定的传输协议,一个通信端口,与IP地址,关系起来。这个关系动作,称为绑定(binding),在这之后,就可以通过网络提交与接收数据。

在操作系统上运行的网络软件,可以通过操作系统,利用各个不同的通信端口,将数据发送到网络上;操作系统也可以根据数据包的IP地址以及端口号,将这些数据包转送到匹配的进程去。

虽然使用同样传输协议,但是特定的IP地址以及通信端口的组合,只会被绑定到单一的特定进程上。当使用同样协议的多个程序,尝试着绑定在同一个IP地址下的相同通信端口,就会产生一个常见的应用程序错误,这个错误有时候被称为通信端口冲突(port conflicts)。

端口号有两种用途:

  • 标识服务器上提供特定网络服务的进程。客户机可以按照服务器IP与端口号与相应的服务器进程创建网络连接,获得相应的网络服务。例如,通常使用80端口号提供http服务,使用23端口号telnet服务。服务器的这种功能叫做listening。客户机通常使用动态指定的端口号与服务器创建连接。
  • 由本机地址、本机端口号、目标机地址、目标机端口号、通信协议组成的五元组,用于唯一确定正在使用的网络连结。因此,对于不同的协议、不同的目标机地址,本机的不同地址(如果本机使用多个网卡)等多种情形,同一个端口号可以复用。因此对于1对1通信,且本机与目标机之间只能创建一个通信连接,则不需要使用端口号。

网络防火墙或者网关还可提供端口转发(port forwarding),即NAT。

OSI七层模型

开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织(ISO)提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。定义于ISO/IEC 7498-1。

层次划分:

根据建议X.200,OSI将计算机网络体系结构划分为以下七层,标有1~7,第1层在底部。 现“OSI/RM”是英文“Open Systems Interconnection Reference Model”的缩写。

第七层 应用层

应用层(Application Layer)提供为应用软件而设的界面,以设置与另一应用软件之间的通信。例如: HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。

第六层 表示层

表示层(Presentation Layer)把数据转换为能与接收者的系统格式兼容并适合传输的格式。

该层被弃用。应用层的HTTP、FTP、Telnet等协议有类似的功能。传输层的TLS/SSL也有类似功能。

第五层 会话层

会话层(Session Layer)负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。

该层被弃用。应用层的HTTP、RPC、SDP、RTCP等协议有类似的功能。

第四层 传输层

传输层(Transport Layer)把传输表头(TH)加至数据以形成数据包。传输表头包含了所使用的协议等发送信息。例如:传输控制协议(TCP)等。

第三层 网络层

网络层(Network Layer)决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成分组。网络表头包含了网络数据。例如:互联网协议(IP)等。

第二层 数据链路层

数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成帧。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务(GPRS)等。

分为两个子层:逻辑链路控制(logic link control,LLC)子层和介质访问控制(media access control,MAC)子层。

第一层 物理层

物理层(Physical Layer)在局部局域网上传送帧,它负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机适配器等

TCP协议

传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据包协议(UDP)是同一层内另一个重要的传输协议。

TCP协议的运行可划分为三个阶段:连接创建(connection establishment)、数据传送(data transfer)和连接终止(connection termination)。

TCP用三路握手(或称三次握手,three-way handshake)过程创建一个连接。在连接创建过程中,很多参数要被初始化,例如序号被初始化以保证按序传输和连接的强壮性。

TCP连接的正常创建

一对终端同时初始化一个它们之间的连接是可能的。但通常是由一端打开一个套接字(socket)然后监听来自另一方的连接,这就是通常所指的被动打开(passive open)。服务器端被被动打开以后,用户端就能开始创建主动打开(active open)。

  1. 客户端通过向服务器端发送一个SYN来创建一个主动打开,作为三路握手的一部分。客户端把这段连接的序号设定为随机数A
  2. 服务器端应当为一个合法的SYN回送一个SYN/ACK。ACK的确认码应为A+1,SYN/ACK包本身又有一个随机产生的序号B
  3. 最后,客户端再发送一个ACK。当服务端收到这个ACK的时候,就完成了三路握手,并进入了连接创建状态。此时包的序号被设定为收到的确认号A+1,而响应号则为B+1

连接终止使用了四路握手过程(或称四次握手,four-way handshake),在这个过程中连接的每一侧都独立地被终止。当一个端点要停止它这一侧的连接,就向对侧发送FIN,对侧回复ACK表示确认。因此,拆掉一侧的连接过程需要一对FIN和ACK,分别由两侧端点发出。

UDP协议

用户数据包协议(英语:User Datagram Protocol,缩写为UDP),又称用户数据报文协议,是一个简单的面向数据报的传输层协议,正式规范为RFC 768。

在TCP/IP模型中,UDP为网络层以上和应用层以下提供了一个简单的接口。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)。UDP在IP数据报的头部仅仅加入了复用和数据校验(字段)。

UDP首部字段由4个部分组成,其中两个是可选的。各16bit的来源端口和目的端口用来标记发送和接受的应用进程。因为UDP不需要应答,所以来源端口是可选的,如果来源端口不用,那么置为零。在目的端口后面是长度固定的以字节为单位的长度域,用来指定UDP数据报包括数据部分的长度,长度最小值为8byte。首部剩下地16bit是用来对首部和数据部分一起做校验和(Checksum)的,这部分是可选的,但在实际应用中一般都使用这一功能。

由于缺乏可靠性且属于非连接导向协议,UDP应用一般必须允许一定量的丢包、出错和复制粘贴。但有些应用,比如TFTP,如果需要则必须在应用层增加根本的可靠机制。但是绝大多数UDP应用都不需要可靠机制,甚至可能因为引入可靠机制而降低性能。流媒体(流技术)、即时多媒体游戏和IP电话(VoIP)一定就是典型的UDP应用。如果某个应用需要很高的可靠性,那么可以用传输控制协议(TCP协议)来代替UDP。

由于缺乏拥塞控制(congestion control),需要基于网络的机制来减少因失控和高速UDP流量负荷而导致的拥塞崩溃效应。换句话说,因为UDP发送者不能够检测拥塞,所以像使用包队列和丢弃技术的路由器这样的网络基本设备往往就成为降低UDP过大通信量的有效工具。数据报拥塞控制协议(DCCP)设计成通过在诸如流媒体类型的高速率UDP流中,增加主机拥塞控制,来减小这个潜在的问题。

socket套接字

socket概念

黏包

原文地址:https://www.cnblogs.com/NeroCl/p/8372856.html

时间: 2024-10-12 14:06:19

网络编程(更新中)的相关文章

网络编程-Java中的Internet查询

前提 在深入理解URL.URI等概念,或者学些Socket相关的知识之,有必要系统理解一下Internet相关的一些基础知识. Internet地址 连接到Internet(因特网)的设备称为节点(node),而任意一个计算机节点称为主机(host).每个节点或者主机都由至少一个唯一的数来标识,这称为Internet地址或者IP地址. IP和域名 如果使用Java作为开发语言的话,不需要担心IP或者域名的工作原理,但是我们需要理解IP寻址的一些基础知识.我们目前常用的网络都是IPv4网络,每个计

第84节:Java中的网络编程(中)

实现客户端和服务端的通信: 客户端需要的操作,创建socket,明确地址和端口,进行键盘录入,获取需要的数据,然后将录入的数据发送给服务端,为socket输出流,然后进行读取服务端发送回来的大写数据,为socket读取流,最后进行客户端显示器的显示,进行读写操作,关闭资源. 网络编程TCP客户端 package com.dashucoding.tcp3; import java.io.BufferedReader; import java.io.BufferedWriter; import ja

asp网络编程:ASP中实现分页显示的七种武器

在微软的ASP编程体系中,ADO对象的建立,使得从网页访问数据库成为一件易事,特别是ADO的Recordset对象使得控制数据的输出显示更为方便.自由.而在Visual InterDev6.0(以下简称VI6.0)中,由于Script Object Model(以下简称SOM).Design-Time Control(以下简称DTC)以及Data Environment Object Model(以下简称DEOM)等对象模型的引入,使网页对数据库的访问设计显得更为方便. 因为主题方面的原因,关于

Python网络编程03----Python3.*中socketserver

socketserver(在Python2.*中的是SocketServer模块)是标准库中一个高级别的模块.用于简化网络客户与服务器的实现(在前面使用socket的过程中,我们先设置了socket的类型,然后依次调用bind(),listen(),accept(),最后使用while循环来让服务器不断的接受请求.而这些步骤可以通过SocketServer包来简化.).模块中,已经实现了一些可供使用的类. 我们将再次实现之前的那个基本TCP的例子.你会注意到新实现与之前有很多相似之处,但你也要注

12、第七周-网络编程 - 线程中的信号量(Semaphore)

互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据.简单介绍如下: 信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作.而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源.比如对全局变量的访问,有时要加锁,操作完了,在解锁.有的时候锁和信号量会同时使用的. 也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比

asp网络编程:ASP中几种分页显示的比较

下面通过对比来看看几种方式的用时对比. 一,使用存储过程分页,这种情况又分为两种方式: 第一种,使用command对象,如下: Set Cmd=server.CreateObject("Adodb.Command") Cmd.ActiveConnection=conn Cmd.CommandText="ycuu_gb_getmsg" Cmd.CommandType=4'adCmdStoredProc cmd.prepared=true' set param=Cmd.

《Unix网络编程》中的错误处理函数

#include "net.h" #include <syslog.h> // syslog() int daemon_proc; static void err_doit(int errnoflag, int level, const char *fmt, va_list ap) { int errno_save, n; char buf[MAXLINE + 1]; errno_save = errno; #ifdef HAVE_VSNPRINTF vsnprintf(n

ACM-ICPC 2018 南京赛区网络预赛(更新中)

A. An Olympian Math Problem 直接输出n-1,注意范围要 long long . #include<cstdio> using namespace std; typedef long long ll; ll t,n; int main(){ scanf("%lld",&t); while(t--){ scanf("%lld",&n); printf("%lld\n",n-1); } retur

C#网络编程技术FastSocket实战项目演练

一.FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包.组包.粘包.维护连接列表等,UDP协议需要处理丢包.乱序,而且对于多连接并发,还要自己处理多线程等等.本期分享课程阿笨给大家带来的是来源于github开源Socket通信中间件:FastSocket,目的就是把大家从繁琐的网络编程技术中彻底地解放和释放出来. 阿笨只想安安静静的学习下网络编程技术Socket后,将学习的成果直接灵活的运用到自己的实际项目中去.

Linux网络编程-----Socket地址API

(1) 通用socket地址 socket网络编程接口中表示socket地址的是结构体sockaddr,其定义如下: #include<bits/socket.h> struct sockaddr { sa_family_t sa_family; char sa_data[14]; } (2)新的通用socket地址结构体 #include<bits/socket.h> struct sockaddr_storage { sa_family_t sa_family; unsigne