文章目录
计算机实现通信
网卡是文件,当向网卡中写文件时就是向网络中写内容,向网络中写内容时就可以被另外一个主机拿到。这样就可以实现通信。
计算机开始时是单机通信的就是计算机内部之间通信,进程之间通信,但是后来逐渐发展到了计算机和计算机之间通信,就相当于是人和人之间通信,计算机和计算机通信是在同一个局域网之下进行通信,因为每一个计算机是相互独立的,每一个计算机有自己执行的业务,然后当一个计算机要知道另外一个计算机工作的内容时,所以它们要通信就要想办法让它们联通起来,进行通信,让计算机之间形成协作。
如计算机A、B、C三台计算机,它们各自有各自的业务,然后执行好之后它们要进行交互,所以要协作通信连通,它们使用网络联通,达到数据共享!
网络互联: 多台计算机连接在一起, 完成数据共享;
而多台计算机联通通信是历史的必然,发展必然离不开多台计算机执行不同的业务,然后再数据汇总。
在一个局域网中当计算机多了之后,要通过交换机和路由器连接在一起!
一个小型的局域网就是一个实验室,在局域网中的各个计算机使用的是同一个网络然后就相当于各个计算机看到的是同一个资源共享资源,多个计算机就相当于是多线程,然后访问临界区资源一样!
不同局域网可以和不同局域网连接在一起,那么当两台主机之间实现数据传输时,会有数据丢失或者对于主机定位问题或者长距离传输数据衰减,长距离传输延申出了这些问题也就有了解决问题的设备。路由器呀交换机之类的设备存在。路由器定位主机,交换机解决数据长距离传输问题!
若是两个国家之间的主机要进行通信则要使用广域网连接起来
广域网WAN: 将远隔千里的计算机都连在一起
所谓 "局域网" 和 "广域网" 只是一个相对的概念. 比如, 我们有 "天朝特色" 的广域网, 也可以看做一个比较大的局域网。当国家和国家之间通信时,每一个国家可以看作是一个个局域网!
协议
协议是一种约定;
协议就如一份合同,然后当两个人签订了一份合同时它们都要遵守合同上的约定。
而计算机之间通信时计算机长距离传输数据可能衰减,而为了解决这些问题需要制定一些协议,在计算机网络中tcp/ip协议,以太网协议,Mac协议,http,https协议等等...计算机网络分了层每一层都有对应的协议。
协议就是双方约定好的并且都要遵守的,只有遵守才能更好的实现交互,不然若是没有协议别人说的话做的事可能都需要花大功夫去解析,所以协议极大的降低了通信的成本,提高了沟通的效率也就是减少了沟通问题的出现!
而协议对于不同的人来说是不一样的,如学校老师和学生它们会遵守不同的协议,不同的身份有不同的协议规则,所以计算机网络分层有不同的协议。
当计算机进行长距离数据传输时,要保证数据准确的到达下一个主机就要通过计算机网络分层的传输层使其到达指定主机,数据转发的时候要对主机进行定位,这样才能知道要发给谁,在同一个局域网中可能会存在多个主机,要保证不错发所以要定位主机确认发给谁。
那么主机发送数据丢失该怎么办?也要有对应协议来保证
把数据从一台主机发送给另一台主机时要保证很多问题,要找到发送的主机也要确保数据安全不丢失,所以在发送数据时还要发送额外的内容用来确保数据能发送过去并且准确,而多的内容由计算机网络分层的每一层来提供,会多报头内容用来表示发送给谁然后也要确保数据安全。就比如在网上购物时不仅仅得到的是买的物品还有一个包装盒,然后上面记录了一些额外的信息用来保证接收的快递是准确的,在计算机中多出来的那一部分为报头,报头中有各种字段信息,这些字段信息一般用结构体对象来表示,里面有解决当前层的问题的方法:到下一个设备通过数据链路层网卡,而定位主机用ip协议,当长距离传输时用tcp协议,而处理发送来的数据用引用层的https,http,ftp协议等...这些包含在报头中。
为什么会有这些问题呢?是因为两个主机距离过于远了,并且在中途会有很多主机然后当这个主机发送数据时可能会被其他主机获取到,然后呢这个主机就要对特定主机进行定位,因为两个主机相隔很远所以不知道因此要对主机定位就像两个人相距距离传输距离变长了所以会存在这些问题!
在通信时,要有一个数据段来描述信息的约定字段,每次在发送数据时要再多发一些东西用来描述,这些发的是一些约定信息这就是报文,而报文信息很多所以用结构体描述起来协议报文协议是双方约定的表现形式为结构体对象约定定义协议,就像我们在正常的说话时,是同一套协议,快递单号也有自己的协议。
发消息多一些信息就是一些协议结构体协议通过结构体表达出来双方都认识的结构体对象->报文
就如一个汉字的含义,每一个汉字设计出来然后一个对应汉字有自己的含义,在生产计算机时有很多东西要统一就是制定的一些标准要统一执行,协议只是标准的一部分,然后由权威官方来制定标准然后由别人来执行
当定制标准之后别人要使用这个标准就需要遵守这个标准。
计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式.
网络传输各种各样的协议然后解决各层的问题也就有了协议分层,分层是使他们耦合度降低,实现高内聚,低耦合就如软件分层一般,分层使它们耦合度降低然后使各层关系不大这样它们在维护上的成本降低了当问题是层状的解决问题的协议也是层状的,就是技术栈规模太大所以分层,但是每一层都和每一层进行通信
打电话分层,逻辑上是人和人,电话和电话
但是实际上是人和电话,电话和人沟通
在语言层有语言协议,然后电话层有电话协议,每一层遵守每一层对应的协议,语言层要保证说出的话语的准确性,要确保双方能获得要进行通信握手,各层之间耦合度很低,然后当语言层出问题几乎不会影响到电话层,几乎可以看作是独立的各层之间但其实不是独立的!而设计为层状结构都是为了便于维护(通过高内聚,低耦合),这只是电话协议在计算机网络协议中只会更加的复杂,不过分层最大的好处在于"封装",对每一个模块进行封装。
OSI七层模型
计算机网络协议中,OSI分为七层协议,这是网络分层标准,先有了这个标准之后再进行网络通信。
OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,
是一个逻辑上的定义和规范;
把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
逻辑上分为七层,每一层都有相关的物理设备,主要功能帮助不同类型的主机实现数据传输。不过虽然标准定义为七层,但是在使用时却是只是使用五层,七层不实用,在计算机网络中使用的是五层协议,但是这样会不会没有遵守OSI这个标准,并不是因为这七层协议的上三层合并为了一层,将会话表示应用压缩为了应用层所以说计算机网络上实用五层,底层物理层,往上数据链路层,然后再是网络层,再是传输层最上层是应用层!五层协议叫做TCP/IP协议层模型!他不是包含一层协议而是包含很多层的协议
每一层有对应的协议,并且有对应的物理设备相关联
第一层物理层,物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层。物理层常用外设相连
集线器保证传输,将信号放大
数据链路层:同一个局域网中两台主机之间数据的传送直接连接两个设备跳转,以太网协议,Mac地址,局域网中任意两台主机之间可以联通通信,不同局域网也可以进行通信。在同一个局域网之下主机通信
同一个局域网之下存在不同主机,然后这些主机两两通信时其他主机都可以看到,但是由于存在Mac地址存在于报文信息中的报头中,然后主机在通信时会检测拿到同层的报文数据然后检测Mac地址,若是就将报头于报文解包,然后将有效载荷传输给上层,若不是就丢弃这个报文啥也不做。
负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层
网络层:负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层。路由器连接两个子网之间的主机!通过ip地址来唯一标识一台主机。
传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机
应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层
网络协议栈分层,操作系统也分层,它们两个之间有关系吗?
网络分层和操作系统会交互
传输层和网络层是位于操作系统内核中的,传输层和网络层是操作系统的一部分
传输层和网络层是Linux内核模块的,所以网络主机通信也是离不开内核操作系统的,主机网络通信是会贯穿操作系统。当用户想要访问网卡时会贯穿操作系统,应用级用户是无法直接访问到网卡而是要通过操作系统,提供的系统调用,在传输层提供一些系统接口来实现数据交互,然后再向下通过网络层交互,向下通过数据链路层最后达到物理层实现访问网卡。
网络通信本质就是贯穿协议栈的过程
网络协议分层各个设备
对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容;
对于一台路由器, 它实现了从网络层到物理层;
对于一台交换机, 它实现了从数据链路层到物理层;
对于集线器, 它只实现了物理层;
网络传输流程图,不考虑物理层
两台主机要进行通信通过底层以太网进行通信
从一台主机的应用层拿数据下来然后tcp/ip协议栈层层交互,然后到达数据链路层之后再通过另一台主机的数据链路层网上层层交互达到应用层实现瓦纳格拉通信,这样没有借助路由器设备的网络通信是在同一个局域网之下的通信!数据链路层通过mac地址然后找到同一局域网之下的主机的mac地址然后进行两台主机的互连通信。同局域网下的主机设备可以直接通信,通过以太网协议保证,以太网是数据链路层的一种通信协议,保证局域网内设备互连。
同意局域网下通信,然后应用层将数据要发送给另一台主机的应用层,要贯穿整个协议栈,发送数据的一台主机不断向下交互,接收数据的主机不断向上交互发送给应用层然后给用户。
两台计算机通过TCP/IP协议进行通信
通信过程,用户将数据发送给应用层然后应用层要发送给另一个主机的应用层要有自己的协议,在接收数据时并且要将协议封装成报文然后向下交互传递给传输层,每一层添加的信息为报文字段的报头字段,然后收到的数据为报文的有效载荷,报头字段是双方规定好的字段,当到达对应协议层的时候根据这个报头信息可以确定信息是传送给我的!应用层将信息结合报头组合成报文,然后发送给传输层;传输层要发送给另一台主机的传输层收到所以也要将协议信息封装成报头然后组合成报文发送给下一层网络层向下交互传输层要保证数据有序,确保对方拿到的数据是正确的不会出现乱序保证数据的可靠性;网络层收到之后同样要实现层与层交互所以也要添加对应自己的报头信息,报头信息中包含定位主机的ip地址,和自己的ip地址,组合成报文发送给数链路层;然后数据链路层获取数据之后添加自己的报头字段发送给另一台主机,数据链路层添加的报头字段为mac地址,是它的mac地址和要去哪里的mac地址,源Mac地址和目的mac地址。
发送方自顶向下交互是要封装报文信息,通过不断的封装
以便于定位发送的主机还有保证数据的可靠安全解决长距离传输出现的问题;
每一层都要添加报头,而每一层去掉报头就为这一层就受到的有效信息为有效载荷,每一层都有自己的有效载荷和报头,有效载荷和报头结合起来就形成了报文了!数据链路层通过以太网将两台主机连接起来,然后实现通信。
当传送的数据达到另一台主机的时候数据链路层拿到报文然后对报头解析,发现自己的mac地址就是目的地址,这个报文就是发给我的,所以将报头与有效载荷分离然后将分离出来的有效载荷发送给上层,但是从数据链路层的视角来看,它上面还有很多层所以在分离报头时它的报文中还有上一层的定位信息,来确保报文传输给哪一层。向上交互解析报头分离报头然后将有效载荷向上交互直到达到应用层!这样就实现两台主机之间通信。为什么每一层拿到报文就能将特定报头解析出来,因为同层通信它们看到的内容是一样的每一层报头都有固定大小然后在每一层就可以根据报头固定大小从而将报头解析出来做到分离!解包和分用就像碗里的水和桶里的水混合,然后倒入桶中这样想将它们分离出来是不可能实现的所以若是想要将桶中的水分离那么就要先将碗里的水装入瓶子中然后等到分离的时候就能做到很好的分离效果!在封装的时候就要考虑将报头和有效载荷分离,封装容易解包难所以在封装的时候就要考虑。未来解包问题。接收方自底向上交互!
封装与分用
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 "上层协议
字段" 将数据交给对应的上层协议处理
扩展:1、几乎任何层的协议,都要提供一种将报头和有效载荷分离的能力
2、几乎任何层协议都要在报头提供决定将自己的有效载荷交给上层的哪一层的能力,要有一个目的地址为交给下层是哪一层协议的能力,识别定位能力!
这两个是大部分协议层的共性。
局域网通信
局域网中多个主机如何做到通信,通过以太网进行通信,通过以太网要找到下一个主机,就要有标识主机的能力,在局域网中的所有主机都可以获得同样的资源就相当于同一间教室老师和学生,老师喊道某一个学生时其他学生也能听到只是它们不做任何回答而是由被喊到的学生来回答做出响应,每一个学生都能够得到这样的一个数据但是只是做不做处理的问题,老师在喊固定同学回答时,其他学生能听到但是与自己对比并不是喊的自己所有就把获得的数据丢弃,不做出回应那么被喊到的哪一个学生就会做出回应,因为他发现老师叫的是自己。在同一个局域网之下所有的主机都能看到某个主机发送的信息,但是每一个主机通过和自己报头信息对比mac地址然后决定要不要做出响应,在同一个局域网中,所有主机对于信息是共享的,局域网是一个共享资源,它是一个共享资源就要保证在任何时刻都只有一个主机在发送消息,在被别的主机获取并且做出响应之前别的主机不能有任何访问局域网的动作,不然可能会造成数据不一致问题,就是如一间教室之中很多人在说话,那么可能导致某些人说的话无法识别或者是混乱的,多数人说的话会发生碰撞导致数据丢失。
那么要避免主机之间数据碰撞,就要让主机在发送数据的时候都要执行碰撞避免的算法就是主机发送数据随机发送或者延迟发送,等到别的主机发送完之后再发送数据,等到其他主机执行完之后我再去执行要保证在任何情况下都只有一个主机在发送数据,在一个局域网中所包含的所有主机形成的一个区域为一个碰撞域。主机是如何得知数据发生碰撞的?每一个主机对于自己发送的数据有自己的辨别能力,有一套自己的碰撞检测算法用来检测数据是否发生碰撞。
在局域网通信中,所有主机都能获取到,那么主机在获取到的时候就算不是这个主机该处理的这个主机都对该主机发送来的数据做出响应,报文被别人抓走存在数据安全问题,所有当应用层在传输数据的时候可以考虑对数据进行加密这样就算是被别人拿到它们也没有办法,保证数据安全。
局域网通信是各个主机之间互斥关系,任何一个时刻只允许一个主机发送消息这样就可以保证数据安全性。并且在同一个局域网中当主机设备越多时,发生碰撞的概率也就越大,密集程度,那么此时可以通过交换机将局域网中的主机划分区域就是划分碰撞域,使碰撞发生的概率相对减少
划分两侧这样可以通过交换机通信防止报文在更大的范围内扩散,可以达到减少碰撞
这只是局域网之间的通信但是普遍来说互联网都是跨网之间通信,要实现跨网通信要使用路由器作为一个中间媒介然后跨网络传输,跨网络传输就是相当于两个局域网以上的子网,然后子网中的两个主机进行通信,每一个子网中的主机有mac地址,但是由于在不同子网中,nac地址可能相同所有要标识唯一主机就需要网络层的协议IP地址就可以用来标识唯一一个主机!在网络层中添加一个路由器,路由器的作用连接两个网络中的主机,实现跨网络传输,路由器是网络程协议中的设备
路由器在网络层跨网传输,他就像是一个中间站,然后路由器的数据由主机过来交给数据链路层的以太网驱动程序,将之前的mac地址分用,然后给到路由器它在封装ip地址,之后它内部有一套能=能够标识目的主机的ip地址,然后封装号之后交给令牌环驱动程序封装mac地址通过令牌环传输数据给目的主机,实现通信,在数据交给路由器时,源mac地址已经发生了改变,目的主机拿到的mac地址不是源主机的mac地址而是路由器一层的令牌环驱动程序的mac地址!狸猫换太子。令牌环是什么?令牌环:它是一个令牌环协议,如以太网拿到mac地址标识符才能发送数据,它是只有拿到令牌才能发送数据。
路由器实现跨网络传输,需要通过IP地址然后知道目的主机是谁将数据发送给谁。跨网络传输就相当于去外省旅游,比如我现在在贵州想到陕西去旅游,那么以最短来看的话可以途径四川省,而当你到达四川之后你不知道接下来的路这么走,那么你可以问当地居民陕西怎么走?然后他可能会问你从哪里来要到哪里去,你就说你从贵州来想去陕西,然后他可能也会问你上一个目的地是从哪里来,然后他会指引你下一个省份应该去哪里,在途中省份不断的变化,但是你起点和终点一直都是固定的,不变的,只有上一次从哪里来然后下一次要去哪在不断的变化,在网络中通信,源主机和目的主机一直不变,但是中途可能会经过许多路由器跨网传输,它的上一个路由器和下一个路由器在不断的变化,也就是mac地址在不断的变化,但是源主机IP地址和目的主机ip地址不变。在这一个过程中,一直不变的地址为ip地址,源Ip地址和目的ip地址,ip地址一般有两种协议家庭,IPv4(32个比特位,4字节,它的风格为0.0.0.0以点分十进制的方式表示,每一个点隔开的数不超过255)和IPv6(128比特位,16字节);一直在变化的地址是mac地址,跨网络的mac地址.IP地址的意义是为了进行路径规划,按照制定方向前进
IP地址是在IP协议中, 用来标识网络中不同主机的地址;
对于IPv4来说, IP地址是一个4字节, 32位的整数;
我们通常也使用 "点分十进制" 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;
MAC地址用来识别数据链路层中相连的节点;
长度为48比特位, 即6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).
IP VS Mac地址
IP地址标识一台主机在全网的唯一性,mac地址是用来标识局域网中主机唯一性的。不同子网主机通信借助路由器,用户发送"你好"给主机A,然后通过层层封装给到数据链路层(以太网驱动程序),IP协议层封装了源IP地址和目的IP地址,然后数据链路层封装了源mac地址和目的mac地址,也就是下一个要去的mac地址,它要通过路由器,层与层之间通信,就会通过以太网将报文发送给以太网驱动程序,然后在数据链路层对报文报头分用,将有效载荷发送给路由器,路由器记得源IP地址和目的IP地址,但是他这里自己有一个IP地址,它封装之后要将封装的报文向下交互给令牌环驱动程序,此时在数据链路层对报文做封装,然后封装令牌环驱动程序的源mac地址和目的主机的mac地址,此时令牌环驱动程序的mac地址已经不是源主机的mac地址,然后通过令牌环将报文发送给目的主机,若是还有路由器就会再交给路由器然后再转换,此时的mac地址已经改变了,狸猫换太子;就如出省旅游,你到了一个地点你会记得你上一次是从哪里来的,然后下一个地点要去哪里才能越来越接近目的地!
而判断目的主机的IP地址不在同一个局域网是网络能自主判断的内部有自己的算法判断。而在这个通信过程中A主机将报文传送给路由器其实是在局域网内进行通信,根据mac地址可以找到数据链路层,然后向上交互。
两个子网的主机要通信就要添加路由器,路由器位于网络层,它可以识别IP报头然后定位是哪一个主机,然后路由器向下交互到令牌环驱动程序,到达数据链路层要重新封装令牌环报头然后再通过封装的mac地址通过令牌环将报文交给主机数据链路层令牌环驱动程序。主机在网络上通信时,在上层看到的内容都是一样的,只有在数据链路层之下看到的不一样,它们的mac地址会有差异,以太网解包给路由器,经过路由器重新封装令牌环驱动程序,当到达下一个子网就会去掉老的mac地址,上三层屏蔽了底层的差异是借助于工作在IP协议层的路由器,IP实现了全球主机的软件虚拟层,一切皆文件思想。
而报文在网络协议层中有不同的称呼,在应用层为请求和响应;传输层:数据段;网络层:数据报;数据链路层:数据帧,在不同的层有不同的叫法。
LInux要查看一个服务器的ip地址mac地址在命令行通过ifconfig查看
inet为IPv4版本的主机ip地址,以"."分隔4个区域,范围都是0~255,netmask为子网掩码,inet6为主机的IPv6版本.ether为以太网,用16进制表示一个冒号分隔表示一个字节,以太网是48个比特位mac地址。
windows下使用ipconfig查看
端口号
在进行网络通信的时候应用层在进行通信网络协议中的下三层主要解决数据安全可靠的到达远端机器,用户使用应用软件完成数据的发送和接收,那么当使用软件时先将软件启动起来,启动起来之后就是一个进程了。应用层网络在通信的本质就是进程间的通信,不过这进程间通信是跨主机的,以前的进程通信是在同一个主机下的通信,进程跨主机通信,要占用网络资源,系统提供的系统接口调用时就可以使用网络资源,使用系统接口交给应用层,传输层和网络层是在Linux内核中,然后传输层与应用层相邻,提供系统调用是由传输层提供,然后进程是在应用层所有提供系统调用给应用层使用!通信将数据交给应用层,在主机中有很多应用,如何知道交给哪一个应用,所有在主机接收数据并要发送时需要标识是哪一个应用发出的并且要发送给哪一个应用,目的应用,而要找到所以要有唯一标识应用的,在传输层也就存在了端口号用来标识应用的唯一性,其实也就是用来标识进程的唯一性,通过端口号准确的将数据交给上层!
应用层每一个应用要绑定一个端口号,然后在传输层报文中要通过端口号来识别应用层应用,那么在传输层会有一个类似哈希表的数据结构来查找端口号是否存在,这样就可以通过传输层决定将报文发送给哪一个应用,每一个应用会绑定一个端口号,每一个应用就是对应一个进程。端口号可以用来绑定主机上的一个网络应用的进程
端口号是啥?
端口号是一个2字节16位的整数;
端口号用来标识主机中唯一的一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
IP地址 + 端口号能够标识网络上的某一台主机的某一个进程(IP地址可以标识唯一的一个主机,端口号可以标识主机中唯一个一个进程,所以IP+端口号可以标识全网唯一的一个进程);
一个端口号只能被一个进程占用;一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定;
而IP+port(端口号)的通信方式叫做socket套接字
标识进程唯一性有进程pid,现在又出现一个端口号来表示进程唯一性,它们两个不冲突吗?因为不是所有的进程都要网络编程,但是所有进程都要有进程pid,就算它们不进行网络通信它们也能在自己主机能通信!
若是将系统接入网络中,那么如果只有进程pid的话,当进程pid一改动,整个网络都会更改,每次开关机时进程Pid都会改变这一在网络中一改变就会发现通信也会改变,可能通信到一半忽然发现通信是不对的,它们具有很强的关联性耦合度太高,所有使用端口号来将它们关联度降低,耦合度降低将它们解耦,这样网络中主机通信通过端口号可以将数据从一个应用层发送给另一个应用层。
那么它们完成通信,客户端是如何知道服务端的端口号?在使用服务时,每一个服务器的端口号都是会暴露出来的,都是众所周知的,因为它要给用户提供服务所有要把端口号暴露出来,那么在使用时就可以使用服务端的端口号,一个用户可以绑定多个端口号,但是一个端口号只能被一个用户绑定。
传输层协议(TCP和UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述 "数据是谁发的, 要发给谁"
TCP/UDP协议
TCP协议,TCP(Transmission Control Protocol 传输控制协议),是传输层的协议,它的特点是有连接;可靠传输;面向字节流。有链接就是可靠的。使用TCP协议要先建立连接然后再通信。虽然它是可靠传输但是同样相对的,它的维护成本相对要高一些
UDP协议,UDP(User Datagram Protocol 用户数据报协议),也是传输层协议,特点是无连接;不可靠传输;面向数据报。不需要建立连接就可以进行通信。
TCP和UDP协议是最靠近应用层的协议,它们可靠传输和不可靠传输是相对的,这是中性的不能因为字面意思而不用udp协议,这两个协议有自己的使用场景,TCP协议用于可靠性较高的传输,需要保密的传输。
网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?
发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.
不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
大端机:高低、低高
小端机:高高、低低
在计算机开始时,就存在大端和小端了,它们没有统一是因为谁也说服不了谁。
如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;
网络数据流采用大端字节序,在通信时,不论是大端机还是小端机都会将发送的数据流转换为大端字节序。
为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
函数名记忆:h表示host,n表示network,l表示32位长整数,s表示16位短整数
例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回 ;
如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。