网络编程理论知识

Posted by 麦子 on Saturday, 2020年01月04日

[TOC]

7层网络模型-OSI

转载地址:https://www.zhihu.com/question/24002080/answer/31817536

结构图

be078715b1914a9ff86882019d8d65fc_hd

**应用层:**就是应用软件使用的协议,如邮箱使用的POP3,SMTP、远程登录使用的Telnet、获取IP地址的DHCP、域名解析的DNS、网页浏览的http协议等;这部分协议主要是规定应用软件如何去进行通信的

**表示层:**决定数据的展现(编码)形式,如同一部电影可以采样、量化、编码为RMVB、AVI,一张图片能够是JPEG、BMP、PNG等, 感觉把我们认识的数据格式转为计算机认识的数据格式。

**会话层:**为两端通信实体建立连接(会话),中间有认证鉴权以及检查点记录(供会话意外中断的时候可以继续,类似断点续传)。

**传输层:**将一个数据/文件斩件分成很多小段,标记顺序以被对端接收后可以按顺序重组数据,另外标记该应用程序使用的端口号及提供QOS。(不同的应用程序使用不同计算机的端口号,同样的应用程序需要使用一样的端口号才能正常通信)

**网络层:**路由选路,选择本次通信使用的协议(http、ftp等),指定路由策略及访问控制策略。(IP地址在这一层)

**数据链路层:**根据端口与MAC地址,做分组(VLAN)隔离、端口安全、访问控制。(MAC地址在这一层)处理VLAN内的数据帧转发,跨VLAN间的访问,需要上升到网络层。

**物理层:**将数据最终编码为用0、1标识的比特流,然后传输。(例如将题主头像的图片,变为一串01100111100这样的数字来表示)。

分析QQ消息流程

1、 当A打开了QQ这个软件,相当就到达应用层了;因为软件会根据你的操作调动机器底层的硬件工作了。

2、 当A往QQ这个软件的聊天窗口里面输入信息,发出后,QQ会将这个信息保存在本地聊天记录文件MSGEX.db(一般就保存在QQ目录下以你的QQ号码为文件夹里)。以某种格式编码/保存某种信息,这可以理解为表示层了。

3、 当A打开与B的聊天窗口,输入信息,按下“输入”按钮,用户的操作就完结了,剩下都是机器自己的操作了。实际传输之前QQ会先建立A与B的会话连接,才真正开始传输信息/数据(你可以理解借传输文件理解:你发送文件给对方,要等待对方按下接收,才算建立了会话,然后才开始传输。)这算会话层了。

4、 会话建立后,会将A发的信息斩件,如A发送“你吃了饭没有”?传输层将这句话斩成“你”“吃”“了”“饭”“没”“有”6个数据段,标记号使用的端口号,然后准备发出去。

5、 接上一层,信息还未发出去,这时候在网络层做路由选路,可以理解为,从A家出去,可以分别经“联通”“电信”“移动”3个网络中的一个再到B家。

网络层根据路由协议负责选路(根据链路质量、带宽、开销等方法论)。假设最后选了2条,可能就A->联通->B发送“你”“吃”“了”3个数据段,A->电信->B发送“饭”“没”“有”3个数据段。

选路后,这一层要标记IP包头,包头主要内容是源IP地址,目的IP地址,使用什么协议。其中源、目的IP相当于你寄信的时候的收发的地址与邮政编码,标记出发送者与接收者。而协议相当于这封信到底用什么语言书写。

6、 然后再到数据链路层,数据链路层主要是负责同一个子网内的通信的。例如A、B连接在同一台二层交换机,就属于同一个子网,那么数据帧的通信室是不需要通过网络层的(即三层交换机或者路由器),直接在这台二层交换机就过去了。这一层打的是MAC地址的帧头,对于上述通信过程来说,就是为数据帧打上A的机器的MAC与A的网关的MAC。这一层的工作就完成了。

7、 最后一层了,经过上述斩件、打完各层标签后的6个数据帧,物理层将他们翻译文6段0、1表示的比特流,然后通过光纤、铜缆进行传输。

8、 当比特流传输到了远端,接着B的机器按照上述的1~7的步骤反方向运行一次即可(即有物理层到应用层)。就是一层层读取标签,传输给标签标记着的相应对象,然后摘除标签,再读取上一层标签,直到最后B的应用程序能够读到A往应用程序输入的数据为止。

6e5c71b163a849019ec55a1267d64930_hd

TCP/IP模型

转载地址:https://zhuanlan.zhihu.com/p/33797520

结构

TCP/IP 模型是由 OSI 模型演化而来,TCP/IP 模型将 OSI 模型由七层简化为五层(一开始为四层),应用层、表示层、会话层统一为应用层。

v2-72754ddc9c8133906ade003ad4a346d5_hd

协议

TCP/IP协议被称为传输控制协议/互联网协议,又称网络通讯协议(Transmission Control Protocol)。是由网络层的IP协议和传输层的TCP协议组成,是一个很大的协议集合。

  • 物理层和数据链路层没有定义任何特定协议,支持所有的标准和专用的协议。
  • 网络层定义了网络互联也就是IP协议,主要包括IP、ARP、RARP、ICMP、IGMP。
  • 传输层定义了TCP和UDP(User Datagram Protocol),我们会后面重点介绍一下TCP协议。
  • 应用层定义了HTTP(超文本传输协议)、FTP(文件传输协议)、DNS(域名系统)等协议。

物理层

计算机在传递数据的时候传递的都是0和1的数字,而物理层关心的是用什么信号来表示0和1,是否可以双向通信,最初的连接如何建立以及完成连接如何终止,总之,物理层是为数据传输提供可靠的环境。

数据链路层

数据链路层们于物理层和网络层之间,用来向网络层提供数据,就是把源计算机网络层传过来的信息传递给目标主机。

数据链路层主要的作用包括:

  • 如何将数据组合成数据帧(Frame),帧是数据链路层的传输单位
  • 数据链路的建立、维护和拆除
  • 帧包装、帧传输、帧同步
  • 帧的差错恢复
  • 流量控制

网络层

网络层位于传输层和数据链路层之间,用于把数据从源主机经过若干个中间节点传送到目标主机,并向传输层提供最基础的数据传输服务,它要提供路由和选址的工作。

那什么是路由和选址呢?

选址

交换机是靠MAC来寻址的,而因为MAC地址是无层次的,所以要靠IP地址来确认计算机的位置,这就是选址。

路由

在能够选择的多条道路之间选择一条最短的路径就是路由的工作。

路由和选址都离不开IP,我们就详细介绍一下IP头部。

IP头

IP头部是由20个字节组成的,具体项所占的位数如下图:

v2-7060962aca6abdc95435330415f968fa_hd

传输层

传输层是面向连接的、可靠的的进程到进程通信的协议。TCP提供全双工服务,即数据可在同一时间双向传播。TCP将若干个字节构成一个分组,此分组称为报文段(Segment)。提供了一种端到端的连接。

传输层的协议主要有TCP 和 UDP,TCP(Transimision Control Protocal)是一种可靠的、面向连接的协议,传输效率低。UDP(User Datagram Protocal)是一种不可靠的、无连接的服务,传输效率高。

TCP和UDP

v2-8775416b2e21e02a72fd65b2c9749741_hd

TCP的功能

TCP主要是将数据进行分段打包传输,对每个数据包编号控制顺序,运输中丢失、重发和丢弃处理。

传说中的三次握手

v2-b93fef4ca387c4aa50071dad72fc2085_hd

  • 第一次握手: 建立连接。客户端发送连接请求,发送SYN报文,将seq设置为0。然后,客户端进入SYN_SEND状态,等待服务器的确认。
  • 第二次握手: 服务器收到客户端的SYN报文段。需要对这个SYN报文段进行确认,发送ACK报文,将ack设置为1。同时,自己还要发送SYN请求信息,将seq为0。服务器端将上述所有信息一并发送给客户端,此时服务器进入SYN_RECV状态。
  • 第三次握手: 客户端收到服务器的ACK和SYN报文后,进行确认,然后将ack设置为1,seq设置为1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

相当于打电话, A:你听的到嘛。 B:我听的到, 你听的到嘛。 A:我听的到。 连接就成功了

数据传输

v2-325456c5c7054ee6b29795a684cbbffb_hd

  • 客户端先向服务器发送数据,该数据报是lenth为159的数据。
  • 服务器收到报文后, 也向客户端发送了一个数据进行确认(ACK),并且返回客户端要请求的数据,数据的长度为111,将seq设置为1,ack设置为160(1 + 159)。
  • 客户端收到服务器返回的数据后进行确认(ACK),将seq设置为160, ack设置为112(1 + 111)。

四次挥手

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,就要断开TCP连接了,就有了神秘的“四次挥手”。

v2-6704e393bd622132d3dac3773412ec26_hd

  • 第一次挥手:客户端向服务器发送一个FIN报文段,将设置seq为160和ack为112,;此时,客户端进入 FIN_WAIT_1状态,这表示客户端没有数据要发送服务器了,请求关闭连接;
  • 第二次挥手:服务器收到了客户端发送的FIN报文段,向客户端回一个ACK报文段,ack设置为1,seq设置为112;服务器进入了CLOSE_WAIT状态,客户端收到服务器返回的ACK报文后,进入FIN_WAIT_2状态;
  • 第三次挥手:服务器会观察自己是否还有数据没有发送给客户端,如果有,先把数据发送给客户端,再发送FIN报文;如果没有,那么服务器直接发送FIN报文给客户端。请求关闭连接,同时服务器进入LAST_ACK状态;
  • 第四次挥手:客户端收到服务器发送的FIN报文段,向服务器发送ACK报文段,将seq设置为161,将ack设置为113,然后客户端进入TIME_WAIT状态;服务器收到客户端的ACK报文段以后,就关闭连接;此时,客户端等待2MSL后依然没有收到回复,则证明Server端已正常关闭,客户端也可以关闭连接了。

注意:在握手和挥手时确认号应该是对方序列号加1,传输数据时则是对方序列号加上对方携带应用层数据的长度。

A:我开始断开了。 B:我收到, 你可以断开了。断开了输出流,输入流还没关闭。 B:发送完所有数据后, 我服务器开始断开了,持续发送FIN命令。 A:发送ACK命令后, 就真的断开了。

应用层

应用层常见协议有HTTP、HTTPS 、FTP 、SMTP等。

分析邮件发送接受流程

v2-fddf614d20e94c08a02861297fb95a99_hd

v2-1ede5aa9c734a98c0d9c259cd92308fe_hd

Socket

转载地址:https://www.cnblogs.com/dolphinx/p/3460545.html

什么是Socket

我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。

能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

05225723-2ffa89aad91f46099afa530ef8660b20

socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

而我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。通过Socket,我们才能使用TCP/IP协议,更好说的就是一个使用TCP/IP协议的程序接口API

Socket通信流程

socket是"打开—读/写—关闭"模式的实现,以使用TCP协议通讯的socket为例,其交互流程大概是这样子的

05232335-fb19fc7527e944d4845ef40831da4ec2

Socket编程理解

现在我们了解到TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外提供编程接口,这就是Socket。现在我们知道,Socket跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。

概念理解

协议

概述

Xnip2020-01-04_11-31-54

Mac地址

转载地址:https://blog.csdn.net/weibo1230123/article/details/82778993

概述

MAC地址就是在媒体接入层上使用的地址,也叫物理地址、硬件地址或链路地址,由网络设备制造商生产时写在硬件内部。MAC地址与网络无关,也即无论将带有这个地址的硬件(如网卡、集线器、路由器等)接入到网络的何处,都有相同的MAC地址,它由厂商写在网卡的BIOS里。

为什么要用到MAC地址

这是由组网方式决定的,如今比较流行的接入Internet的方式(也是未来发展的方向)是把主机通过局域网组织在一起,然后再通过交换机和 Internet相连接。这样一来就出现了如何区分具体用户,防止盗用的问题。由于IP只是逻辑上标识,任何人都随意修改,因此不能用来标识用户;而 MAC地址则不然,它是固化在网卡里面的。从理论上讲,除非盗来硬件(网卡),否则是没有办法冒名顶替的

基于MAC地址的这种特点,局域网采用了用MAC地址来标识具体用户的方法。注意:具体实现:在交换机内部通过“表”的方式把MAC地址和IP地址一一对应,也就是所说的IP、MAC绑定。

具体的通信方式:接收过程,当有发给本地局域网内一台主机的数据包时,交换机接收下来,然后把数据包中的IP地址按照“表”中的对应关系映射成MAC地址,转发到对应的MAC地址的主机上,这样一来,即使某台主机盗用了这个IP地址,但由于他没有这个MAC地址,因此也不会收到数据包。

报文和帧

转载地址:https://zhuanlan.zhihu.com/p/26175504

概述

在OSI七层与TCP/IP五层网络架构中,数据发送时,由上层向下层封装,报文(4层叫法)是网络传输的单位,传输过程中会不断封装成分组、包(3层叫法)、帧(2层叫法)来传输,封装的方式就是添加一些信息段。

报文

传输层传输的是数据报文,主要是协议格式。

**报文(message):**网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。

报文就是个数据块,包括要传送的数据,也包括必要的附加信息(包括目的IP,目的端口,源地址,源端口,数据长度,所用协议,加密等等)。就好像是邮寄一封信,对方要得到的只是里边的内容,但你要发送,就必须有信封,有邮票,有地址邮编,等等附加的东西,报文指的就是包括信封在内的所有东西,而不是单指客户要发送的数据。

报文段(segment):组成报文的每个分组。分组交换也称为包交换,它将用户通信的数据划分成多个更小的等长数据段,在每个数据段的前面加上必要的控制信息作为数据段的首部,每个带有首部的数据段就构成了一个分组。首部指明了该分组发送的地址,当交换机收到分组之后,将根据首部中的地址信息将分组转发到目的地,这个过程就是分组交换。能够进行分组交换的通信网被称为分组交换网。

三层,网络层传输的是数据包,包含数据报文,并且增加传输使用的IP地址等三层信息。

**数据报(Datagram):**通过网络传输的数据的基本单元,包含一个报头(header)和数据本身,其中报头描述了数据的目的地以及和其它数据之间的关系。可以理解为传输数据的分组。我们将通过网络传输的数据的基本单元称为数据报。

数据链路层的协议数据单元。我们将链路层分组称为帧。

数据在网络上是以很小的称为帧(Frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。

IPV4和IPV6

转载地址: https://blog.csdn.net/li563868273/article/details/51126735

目前的全球因特网所采用的协议族是TCP/IP协议族。IP是TCP/IP协议族中网络层的协议,是TCP/IP协议族的核心协议。目前IP协议的版本号是4(简称为IPv4),发展至今已经使用了30多年。IPv4的地址位数为32位,也就是最多有2的32次方的电脑可以联到Internet上,近十年来由于互联网的蓬勃发展,IP位址的需求量愈来愈大,使得IP位址的发放愈趋严格,各项资料显示全球IPv4位址可能在2005至2008年间全部发完。

什么是IPv6什么是IPv6?IPv6是下一版本的互联网协议,也可以说是下一代互联网的协议,它的提出最初是因为随着互联网的迅速发展,IPv4定义的有限地址空间将被耗尽,地址空间的不足必将妨碍互联网的进一步发展。

为了扩大地址空间,拟通过IPv6重新定义地址空间。IPv6采用128位地址长度,几乎可以不受限制地提供地址。按保守方法估算IPv6实际可分配的地址,整个地球的每平方米面积上仍可分配1000多个地址。在IPv6的设计过程中除了一劳永逸地解决了地址短缺问题以外,还考虑了在IPv4中解决不好的其它问题,主要有端到端IP连接、服务质量(QoS)、安全性、多播、移动性、即插即用等。

Xnip2020-01-04_11-37-37

端口

Xnip2020-01-04_11-41-15

Xnip2020-01-04_11-39-58

IP地址结构

Xnip2020-01-07_17-34-24

子网掩码

链接:https://www.jianshu.com/p/afce4b3f4f83

对于子网掩码这个名字相信很多人并不陌生,在我们查看电脑的IP地址时,会看到IP地址下面就是子网掩码。那么子网掩码到底是什么呢?它有有什么用呢?在说这个问题之前,我们先来看下这样一个场景,一个规模100人的公司申请了一个C类IP地址网段218.17.21.0(不清楚IP地址分类的可以查看IPv4IP地址),可以容纳254台主机。公司分行政、财务、市场、销售、售后、研发六个部门,每个部门有十几台主机,现在需要按照部门来划分子网,要怎么划分呢?那这里就需要用到子网掩码了。

子网掩码是用于将一个IP地址划分成网络地址和主机地址2个部分,它是不能单独存在的,它必须和IP地址一起使用。子网掩码中1的个数表示IP地址的前面多少位表示网络地址,0的格式表示IP地址后面多少位表示主机地址。

广播地址

广播地址(Broadcast Address)是专门用于同时向网络中(通常指同一子网)所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机标识段host ID(简称主机 ID) 为全 1 的 IP 地址为广播地址,广播的分组传送给同一个子网的所有计算机。例如,对于10.1.1.0 (255.255.255.0 )网段,其广播地址为10.1.1.255 (255 即为 2 进制的 11111111 ),当发出一个目的地址为10.1.1.255 的数据包时,它将被分发给该网段上的所有计算机。广播地址应用于网络内的所有主机

DHCP简介

原文链接:https://blog.csdn.net/u011857683/article/details/83019895

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)使用UDP协议工作,采用67(DHCP服务器端)和68(DHCP客户端)两个端口号。546号端口用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务。DHCP客户端向DHCP服务器发送的报文称之为DHCP请求报文,而DHCP服务器向DHCP客户端发送的报文称之为DHCP应答报文。DHCP采用C/S(客户端/服务器)模式,可以为客户机自动分配IP地址、子网掩码以及缺省网关、DNS服务器的IP地址等,并能够提升地址的使用率。

问题

1. socket 和 HTTP协议的区别

Http是应用层协议

由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。

socket是在应用层和传输层之间的一个抽象层

socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

「真诚赞赏,手留余香」

真诚赞赏,手留余香

使用微信扫描二维码完成支付