10-01 互联网协议

一. 引入: 操作系统

操作系统是管理和控制硬件资源和软件资源的计算机程序, 是直接运行在"裸机"上的最基本的系统软件, 任何其他软件都必须在操作系统的支持下才能运行. 

也就是说, 我们的计算机上的软件与另一台计算机之间的软件想要基于网络通信那么也必须基于操作系统之上运行.现在我们有了操作系统, 那么我们接下来了解下它们是怎么通信的.

二. CS架构 & BS架构

# 互联通信软件有两种模式:CS架构和BS架构
	- CS指的是Client-Server,分别有一个客户端软件和一个服务端软件
	- BS指的是Browser-Server,一个浏览器和一个服务端软件

客户端软件send                 服务端软件recv
操作系统                       操作系统
计算机硬件 <====物理介质=====>  计算机硬件

三. 网络通信原理

计算机通信是计算机中的进程(即运行着的程序)之间的通信

网络 = 物理链接介质 + 互联网通信协议

# 网络存在的意义就是跨地域数据传输, 称之为通信.

# 互联网的本质就是一系列的网络协议

# 互联网协议的功能:定义计算机如何接入internet,以及接入internet的计算机通信的标准。

三. 网络体系结构

计算机网络的各层及其协议的集合,称为网络的体系结构。

互联网通信协议更具历史的发展分别有:osi七层协议、TCP/IP四层协议、TCP/IP五层协议

  • OSI的七层协议体系结构的概念清楚,理论也较完整,但它既复杂又不实用。
  • TCP/IP体系结构则不同,它现在已经得到了非常广泛的应用。TCP/IP是一个四层的体系结构,它包含应用层、运输层、网际层和网络接口层(用网际层这个名字是强调这一层是为了解决不同网络的互连问题)。不过从实质上讲,TCP/IP只有最上面的三层,因为最下面的网络接口层基本上和一般的通信链路在功能上没有多大差别,对于计算机网络来说,这一层并没有什么特别新的具体内容。因此在学习计算机网络的原理时往往采取折中的办法,即综合OSI和TCP/IP的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。
# 名词解析
协议: 协议是每一层功能的实现方法, 规定了数据的组织格式.
	- 数据格式: 头部+数据部分

四. OSI七层协议数据传输的封包与解包过程

图解:

传输层一组数据称之为'段'
网络层一组数据称之为'包'
数据链路层一组数据称之为'帧'
物理层一组数据称之为'位'

四. 物理层

1. 物理层由来

孤立的计算机之间要想一起玩,就必须接入internet,言外之意就是计算机之间必须完成组网

2. 物理层功能

主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0=

规定: 物理层一组数据称之为'位'

五. 数据链路层

1. 数据链路层由来

物理层单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思.

2. 数据链路层功能

定义了电信号的分组方式

3. 数据链路层遵循的协议: 以太网协议(ethernet)

# 协议规定1: 一组数据称之为一个数据帧

# 协议规定2: 数据帧分成两部分 ==> 头部 + 数据
	- 头部包含:  源MAC地址(6个字节) + 目标地址MAC(6个字节) + 数据类型(6个字节). 
	- 数据部分包含: 包含的是网络层发过来的整体的内容(最短46字节,最长1500字节)
	- 数据帧最短64字节,最长1518字节. 超过最大限制就分片发送给物理层.
	
# 协议规定3: 规定但凡接入互联网的主机必须有一块网卡,每块网卡在出厂时都烧制好一个全世界独一无二的地址,该地址称之为MAC地址

Ethernet通信方式: ethernet采用最原始的方式,广播的方式进行通信,即计算机通信基本靠吼

补充: MAC地址长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

4. 明白以太网通信并不是什么时候都会广播通信!!

# 知识储备: 
网络节点之间通讯方式分3重: 单播、组播、广播
1.单播:网络节点之间的通信就好像是人们之间的对话一样。

    假设一个人对另外一个人说话。那么用网络技术的术语来描写叙述就是“单播”。此时信息的接收和传递仅仅在两个节点之间进行。单播在网络中得到了广泛的应用。网络上绝大部分的数据都是以单播的形式传输的,仅仅是一般网络用户不知道而已。
    
    比如,你在收发电子邮件、浏览网页时,必须与邮件server、Webserver建立连接,此时使用的就是单播传输数据方式。可是通常使用“点对点通信”(Point to Point)取代“单播”,由于“单播”一般与“多播”和“广播”相相应使用。


2.多播:“多播”也能够称为“组播”。在网络技术的应用并非非常多,网上视频会议、网上视频点播特别适合採用多播方式。

    由于假设採用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这样的方式显然效率极低。是不可取的;假设採用不区分目标、所有发送的广播方式。尽管一次能够传送完数据。可是显然达不到区分特定数据接收对象的目的。採用多播方式,既能够实现一次传送所有目标节点的数据,也能够达到仅仅对特定对象传送数据的目的。
    
  IP网络的多播一般通过多播IP地址来实现。
  
    多播IP地址就是D类IP地址。即224.0.0.0至239.255.255.255之间的IP地址。
    
    Windows 2000中的DHCP管理器支持多播IP地址的自己主动分配。 

3.广播:“广播”在网络中的应用较多,如客户机通过DHCP自己主动获得IP地址的过程就是通过广播来实现的。可是同单播和多播相比,广播差点儿占用了子网内网络的全部带宽。拿开会打一个例如吧,在会场上仅仅能有一个人发言,想象一下假设全部的人同一时候都用麦克风发言,那会场上就会乱成一锅粥。

    集线器因为其工作原理决定了不可能过滤广播风暴。一般的交换机也没有这一功能。只是如今有的网络交换机(如全向的QS系列交换机)也有过滤广播风暴功能了,路由器本身就有隔离广播风暴的作用。   广播风暴不能全然杜绝,可是仅仅能在同一子网内传播。就好像喇叭的声音仅仅能在同一会场内传播一样,因此在由几百台甚至上千台电脑构成的大中型局域网中。一般进行子网划分,就像将一个大厅用墙壁隔离成很多小厅一样,以达到隔离广播风暴的目的。

  在IP网络中,广播地址用IP地址“255.255.255.255”来表示。这个IP地址代表同一子网内全部的IP地址。
  
# 给出一个MAC地址怎样区分出他是单播,组播还是广播地址?? 
单播MAC地址:指第百一个字节的最低位是0的MAC地址。
如:xxxxxxx0-xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx

组播度MAC地址:指第一个字节的最低知位是1的MAC地址。道
如:xxxxxxx1-xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx

广播MAC地址:每个回比特都是1的MAC地址。广播是组播的一答个特例。
如:11111111-11111111-11111111-11111111-11111111-11111111

# 解析:
    大家都说以太网通信都是通过广播通信, 但是我想说, 其实这说的并不是很准确. 应该这么说: 在一台主机不知道目标MAC地址的时候才会使用广播通信.
    在知道目标MAC地址时, 例如: 我们的个人电脑的目标MAC地址的第一个字节的最低位一定是0. 这个时候个人电脑与目标主机进行在以太网中会进行单播通信.

六. 网络层

1. 网络层由来

有了MAC地址、以太网协议的数据处理以太网协议的广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网是由一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到,这就不仅仅是效率低的问题了,这会是一种灾难. 因此必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包),MAC地址是无法区分的,它只跟厂商有关

2. 网络层功能

引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址(IP地址+子网掩码).

3. 网络层遵循的协议: IP协议(Internet Protocol)

规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示.

4. IP协议之IP地址分类

4-1. IP地址及其表示方法

# 每一类地址都由两个固定长度的字段组成
	- 网络号 net-id: 它标识主机(或路由器)所连接到的网络
	- 主机号 host-id:它标识主机(或路由器)。

# IP地址通常由点分十进制的方式来表示。
# 根据网络号和主机号的不同,分为A,B,C,D,E类。其中,A类网络号少,网络内主机号多,通常是比较大的网络,如一个国家或者地区的网络。

# 同理,B类或者C类,网络号逐渐增多,但每个网络内的主机号逐渐减少。比如我们某个学校或者公司的网络,可以容纳的数量有限,通常使用的C类网络。

# D类和E类属于比较特殊的网络,分别用于广播和备用 。

4-2. 常用的三种类别的IP地址

A类IP地址由1字节的网络地址和3字节的主机地址组成,其中网络地址的最高位必须为0。A类IP地址中可指派的网络数量为126(2^ 7-2)个,这里减2是由于网络号字段中全0的IP地址为保留地址,表示本网络,而网络号为127的地址保留用于环回测试本机的进程间通信(127.0.0.0到127.255.255.255是保留地址,用于环回测试,0.0.0.0到0.255.255.255也是保留地址,用于表示所有的IP地址。) A类IP地址中主机号占3个字节,因此每个A类网络中最大主机数为16777214(2^ 24-2),这里减2的原因是,主机号字段为全0表示该IP地址为本机所属网络的地址(如一个主机的IP地址为5.6.7.8,则该主机所在的网络地址就是5.0.0.0),而全1表示所有的,因此全1的主机号字段表示该网络中的所有主机。IP地址空间共有2^32个地址,整个A类地址空间共有2^31个地址,占整个地址空间的50%。

B类IP地址由2字节的网络地址和2字节的主机地址组成,其中网络地址的最高两位必须为10。由于网络号字段的前两位固定,后面的14位无论怎样都不可能出现全0或全1的情况,因此这里不存在网络总数减2的问题。但实际上B类网络地址中128.0.0.0是不可指派的,而可以指派的B类最小网络地址为128.1.0.0,因此B类地址可指派的网络数为16383(2^14-1)个。B类地址的每个网络上最大主机数为65534(2^16-2)个,这里需要减2是因为要扣除全0或全1的主机号。整个B类地址空间共约有2^30个地址,占整个地址空间的25%。

C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须为110。C类网络地址中192.0.0.0为保留地址不可指派,因此可以指派的网络总数为2097151(2^21-1)个,同理,C类地址的每个网络上最大主机数为2^8-2。整个C类地址空间共约有2^29个地址,占整个地址空间的12.5%。

5. IP协议之地址解析协议ARP(Address Resolution Protocol)

5-1. 什么是ARP协议

ARP协议的作用: 已知一个机器(主机或路由器)的IP地址, 通过地址解析协议ARP找出其相应的硬件地址(MAC地址)。

ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。

5-2. ARP协议的工作原理:

在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的

我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。
	- 如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;
	- 如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”, 这表示向同一网段内的所有主机发出这样的询问:“192.168.1.1的MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:“192.168.1.1的MAC地址是00-aa-00-62-c6-09”.

这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。

# 同一网段: 指的是IP地址和子网掩码相与得到相同的网络地址

5-3. 如何查看ARP缓存表

ARP缓存表是可以查看的,也可以添加和修改。在命令提示符下,输入“arp -a”就可以查看ARP缓存表中的内容了,如附图所示。
用“arp -d”命令可以删除ARP表中某一行的内容;用“arp -s”可以手动在ARP表中指定IP地址与MAC地址的对应

5-4. ARP欺骗

其实,此起彼伏的瞬间掉线或大面积的断网大都是ARP欺骗在作怪。ARP欺骗攻击已经成了破坏网吧经营的罪魁祸首,是网吧老板和网管员的心腹大患。

从影响网络连接通畅的方式来看,ARP欺骗分为二种,一种是对路由器ARP表的欺骗;另一种是对内网PC的网关欺骗。
	- 第一种ARP欺骗的原理是——截获网关数据。它通知路由器一系列错误的内网MAC地址,并按照一定的频率不断进行,使真实的地址信息无法通过更新保存在路由器中,结果路由器的所有数据只能发送给错误的MAC地址,造成正常PC无法收到信息。
	- 第二种ARP欺骗的原理是——伪造网关。它的原理是建立假网关,让被它欺骗的PC向假网关发数据,而不是通过正常的路由器途径上网。在PC看来,就是上不了网了,“网络掉线了”。
	
一般来说,ARP欺骗攻击的后果非常严重,大多数情况下会造成大面积掉线。有些网管员对此不甚了解,出现故障时,认为PC没有问题,交换机没掉线的“本事”,电信也不承认宽带故障。而且如果第一种ARP欺骗发生时,只要重启路由器,网络就能全面恢复,那问题一定是在路由器了。为此,宽带路由器背了不少“黑锅”。

举例: 在同一子网, 本机172.16.10.10/24访问目标172.16.10.11/24

# 提示1: 以下情况是ARP缓存表中没有以下的ip地址与MAC地址的对于关系. 
# 提示2: 子网掩码都是24位.
# 提示3: 头部中的数据描述部分占时省略

1. 在网络层本机先通过ip地址和子网掩码进行AND运算区分出目标地址所处的子网, 发现是在同一子网.
	- 数据报格式为: (本机MAC, FF:FF:FF:FF:FF:FF)(本机172.16.10.10/24, 目标172.16.10.11/24)(传输层整体)
	
2. 在数据链路层本机向同一网段内的所有主机发出这样的询问目标172.16.10.11/24的MAC地址是什么? 网络上其他主机并不响应ARP询问,只有目标主机接收到这个帧才向本机做出这样的回应, 因此本机就知道了目标主机的MAC地址
	- 数据报格式为: (本机MAC, 目标主机MAC)(本机172.16.10.10/24,  目标172.16.10.11/244)(传输层整体)
	
3. 主机与目标主机就可以在局域网内使用广播的方式通信了.

举例: 在同一子网, 本机172.16.10.10/24访问目标(公网)139.196.184.91/24

# 提示1: 以下情况是ARP缓存表中没有以下的ip地址与MAC地址的对于关系. 
# 提示2: 子网掩码都是24位.
# 提示3: 头部中的数据描述部分占时省略

1. 在网络层本机先通过ip地址和子网掩码进行AND运算区分出目标地址所处的子网, 发现不在同一子网.
	- 数据报格式为: (本机MAC, FF:FF:FF:FF:FF:FF)(本机172.16.10.10/24, 公网139.196.184.91/24)(传输层整体)
	
2. 在数据链路层本机向同一网段内的所有主机发出这样的询问目标172.16.10.11/24的MAC地址是什么? 网络上其他主机并不响应ARP询问,只有网关主机接收到这个帧才向本机做出这样的回应, 因此本机就知道了网关主机的MAC地址
	- 数据报格式为: (本机MAC, 网关主机MAC)(本机172.16.10.10/24,  公网139.196.184.91/24)(传输层整体)
	
3. 由网关主机通过层层的路由访问到了公网的网关139.196.184.91/24

4. 通过公网网关139.196.184.91/24与公网所在局域网内的目标主机IP地址的隐射关系找到这台正在局域网内的主机, 这就实现了不同局域网之间的主机与主机之间的通信

6. IP协议之IP数据包

#  网络层一组数据称之为一个数据'包'

# ip数据包也分为head和data部分,无须为ip包定义单独的栏位,会直接被放入以太网包的data部分
head:长度为20到60字节
data:最长为65515字节。
而以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了

# 一个数据'包'大小范围65535~65575字节

7. 子网划分(待补全)

7-1. 从两级IP地址到三级IP地址

https://blog.51cto.com/6930123/2113151

7-2. 子网掩码

所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND逻辑与运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

判断两个IP地址是否处于一个自网络内示例:

# 已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?

# 计算
172.16.10.1:        10101100.00010000.00001010.000000001
255255.255.255.0:    11111111.11111111.11111111.00000000
AND运算得网络地址结果:10101100.00010000.00001010.000000001 ---> 172.16.10.0

172.16.10.2:        10101100.00010000.00001010.000000010
255255.255.255.0:    11111111.11111111.11111111.00000000
AND运算得网络地址结果:10101100.00010000.00001010.000000001 ---> 172.16.10.0

结果都是172.16.10.0,因此它们在同一个子网络。

8. 数据传输流程总结

  • <1> 网络层拿到上层传过来的数据,将数据打包,加一个ip头。这个ip头至少包含两部分(我的ip和对方主机的ip,ip包含子网掩码)
  • <2> 将打包好ip头的数据传给下一层的数据链路层前会做一个判断,判断判断对方主机的ip和我自己的ip是不是在一个局域网内。(判断的方式: ip和子网掩码做一个逻辑与的位运算。计算后的结果相等则表示在一个局域网内,否则对方主机不在当前局域网内。)
  • <3> 当两台主机在一个局域网内,此时会自动触发arp协议执行。如果arp缓存表中没有目标主机ip与mac的对于关系, 则会通过广播的方式发一个arp包,局域网内就会通过目标主机当前ip地址获取的对方主机的mac地址。局域网内所有的主机收到消息后发现arp包里面是自己的ip就会将mac地址响应给发送arp协议的主机,如果包里面的ip不是自己就将包丢掉, 不做出任何响应。
  • <4> 当两台主机不在一个局域网内,此时会自动触发arp协议执行。如果arp缓存表中没有网关主机ip与mac的对于关系, 则会通过广播的方式发一个arp包,局域网内就会通过网关主机当前ip地址获取的网关主机的mac地址。局域网内所有的主机收到消息后发现arp包, 只有网关主机会将mac地址响应给发送arp协议的主机.
  • <5> 通过步骤<3>或者<4>拿到对方主机mac地址后,此时网络层整体的数据就会下发到数据链路层进行再次打包,数据链路层会在网络层发送过来的整体数据前加一个以太网的头。这个头主要包含三部分,自己的mac地址和对方主机的mac地址, 以及数据的描述信息。
  • <6> 将步骤<5>所有数据由物理层将数据转为二进制,通过网线传输出去,此时就会经过二层交换机,二层交换机可以将数据包解开到数据链路层,通过MAC判断接收端是谁.(同一子网: 通信的是局域网内得主机. 不同子网: 通信是网关主机)
  • <7> 不同子网情况下, 二层交换机会接着将所有数据发送给路由器(或者三层交换机), 由路由器解包到网络层, 通过ip(公网ip)判断最近的发送给下一个路由器的路径, 经过层层路由转发送达目标网关主机.
  • <8> 目标网关主机通过ip地址的映射关系, 返回其局域网内的主机的ip地址. 通过该ip地址就又由arp协议解析, 最终拿到目标主机的mac地址.
  • <9> 目标网关主机拿到目标主机的mac地址就使用广播的方式发送数据, 只有目标mac地址与网关通过ip解析的mac地址所对应的主机才会收到该数据. 由此就实现了主机与主机之间的通信.

9. 总结

# IP协议的作用主要有两个: 一个是为每一台计算机分配IP地址. 另一个是确定哪些地址在同一个子网络。

# 网络层要达到的目的: 划分广播域(子网), 每一个广播域但凡要接通外部, 一定要有一个网关帮内部的计算机转发包到公网, 网关与外界通信走的都是路由协议.

# 由IP地址+子网掩码进行AND与运算判断发送端IP与接收端IP是否在同一子网.

# arp协议只在一个局域网内通过ip解析获取mac地址,不会跨局域网根据ip地址获取主机mac地址。

# 局域网内每个主机的ip地址必须各不相同,这才实现了arp协议根据ip地址解析成mac地址的可能。

# IP地址 + MAC地址: 可以标识全世界内独一无二的一台计算机. 而与因为有了ARP以协议可以将IP地址转换映射成MAC地址, 所以也可以说: 有了IP地址就能标识全世界内独一无二的一台计算机.

拓展了解: https://www.cnblogs.com/JuneWang/p/3917697.html

七. 传输层

1. 传输层的由来

网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,但是我们写网络通信软件最主要的是找到目标计算机上的某个软件,上面的mac+ip还不能实现这个需求。那么我们通过ip和mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,如果把IP地址比作一间房子 ,端口就是出入这间房子的门.端口就是应用程序与网卡关联的编号.

2. 传输层功能

传输层提供了主机应用程序进程之间基于网络与另外主机之间应用程序进程之间的通信.

3. 传输层的端口

端口号只具有本地意义: 它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。在因特网不同计算机中,相同的端口号是没有关联的

2-1. 3种端口号的划分

# 前提: 只有基于网络通信的进程才有端口号的概念. 
# 提示: 传输层端口号采用16位来标识一个端口, 因此会有2^16=65536个端口

# 服务器端使用的端口号: 分为2类
	1) 熟知端口号或系统端口号(最重要): 数值为0~1023. IANA把这些端口号指派给了TCP/IP最重要的一些应用程序,让所有的用户都知道。当一种新的应用程序出现后,IANA必须为它指派一个熟知端口,否则因特网上的其他应用进程就无法和它进行通信。
	2) 登记端口号: 数值为1024~49151
	
# 客户端使用的端口号
	3) 短暂端口号: 49152~65535. 这类端口号是留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的端口号,因而可以把数据发送给客户进程。通信结束后,刚才已使用过的客户端口号就不复存在,这个端口号就可以供其他客户进程使用。

2-2. 常用熟知的端口介绍

注意!!!: TCP/UDP协议是传输层的协议, 传输层定义了端口的概念. 以下介绍的FTP,SSH协议是应用层的协议, 这些协议分别基于TCP或者UDP通信而已不要混淆了.

# 使用TCP协议的常见端口主要有以下几种: 
1. 21端口 FTP(File Transfer Protocol):定义了文件传输协议。常说某某计算机开了FTP服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP服务。 
	
2 22端口 SSH(Secure Shell): SSH是替代Telnet和其他远程控制台管理应用程序的行业标准。SSH命令是加密的并以几种方式进行保密。SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的“通道”。SSH(Secure SHell)到目前为止有两个不兼容的版本——SSH1和SSH2。
SSH1又分为1.3和1.5两个版本。
	- SSH1采用DES、3DES、Blowfish和RC4等对称加密算法保护数据安全传输,而对称加密算法的密钥是通过非对称加密算法(RSA)来完成交换的。SSH1使用循环冗余校验码(CRC)来保证数据的完整性,但是后来发现这种方法有缺陷。
	- SSH2避免了RSA的专利问题,并修补了CRC的缺陷。SSH2用数字签名算法(DSA)和Diffie-Hellman(DH)算法代替RSA来完成对称密钥的交换,用消息证实代码(HMAC)来代替CRC。同时SSH2增加了AES和Twofish等对称加密算法。

3. 23端口 Telnet:它是一种用于远程登陆的端口,Telnet采用明文传输,传输过程容易被窃取. 用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务。如以前的BBS是纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。 
	补充BBS: 网络论坛是一个和网络技术有关的网上交流场所。一般就是大家口中常提的BBS。 BBS的英文全称是Bulletin Board System,翻译为中文就是“电子公告板”。BBS最早是用来公布股市价格等类信息的,当时BBS连文件传输的功能都没有,而且只能在苹果计算机上运行。

4. 25端口 SMTP(Simple Message Transfer Protocol):定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置中常看到有这么SMTP端口设置这个栏,服务器开放的是25号端口。 


# 使用UDP协议端口常见的有: 
1. 80端口 HTTP(Hyper Text Transfer Protocol):这是大家用得最多的协议,它就是常说的"超文本传输协议"。上网浏览网页时,就得在提供网页资源的计算机上打开80号端口以提供服务。常说"WWW服务"、"Web服务器"用的就是这个端口。 

2. 443端口 HTTPS(Hyper Text Transfer Protocol): 即网页浏览端口,主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP。在一些对安全性要求较高的网站,比如银行、证券、购物等,都采用HTTPS服务,这样在这些网站上的交换信息,其他人抓包获取到的是加密数据,保证了交易的安全性

3. 53端口 DNS(Domain Name System):用于域名解析服务,这种服务在Windows NT系统中用得最多的。因特网上的每一台计算机都有一个网络地址与之对应,这个地址是常说的IP地址,它以纯数字+"."的形式表示。然而这却不便记忆,于是出现了域名,访问计算机的时候只需要知道域名,域名和IP地址之间的变换由DNS服务器来完成。

4. 67/68 DCHP(Dynamic Host Configuration Protocol): 68是发送端口(客户端), 67是接收端口(服务端). 主要是给网络快速自动地分配IP地址。此外,它还可以给设备上配置正确的子网掩码,默认网关和DNS服务器信息。

4. 传输控制协议TCP(Transmission Control Protocol)

详解: https://www.jianshu.com/p/ca64764e4a26

TCP报文图示:

位码即TCP标志位, 有6种标志:

  • UAG(urgent 紧急)
  • ACK(acknowledgement 确认)
  • PSH(push 传送)
  • RST(reset 复位)
  • SYN(Synchronize Sequence Numbers 同步序列编号)
  • FIN(finsh 结束)

TCP的连接建立: 三报文握手

开始阶段: 服务器在客户端发送请求之前一直处于`LISTEN`状态, 等待客户端的连接请求. 如有, 则立即做出响应.

第一次握手: TCP客户端进程打算建立连接时, 向服务器发送请求报文段, 这时首部中的同步位`SYN=1`, 同时选择一个初始序列`seq=x`. 请求报文段发送出去以后, TCP客户端进入`SYN_SEND(同步已发送)`状态.(提示: TCP协议规定, SYN报文段, 即SYN=1的报文段不能携带数据, 但要消耗一个序列号. 这里我们消耗了一个初始序列号x)

第二次握手: 服务器在接收到客户端的请求报文后, 如同意连接, 则向客户端发送确认. 再确认报文中应把SYN位和ACK位都重置为1, 确认号是`ack=x+1`(提示: 这个确认号是成功收到客户端请求的序列号的基础之上加1), 同时也为自己选择一个初始序列号`seq=y`. 这时TCP服务器进程进入`SYN_RECV(同步收到)`状态.(提示: 这个报文段也不能携带数据, 但同样要消耗一个序列号.)

第三次握手: TCP客户进程收到服务器的确认后, 还要向服务器给出确认. 此时将确认报文段的ACK重置为1, 确认号`ack=y+1`, 而自己的序列号`seq=x+1`. TCP的标准规定, ACK报文段可以携带数据. 但如果不携带数据则不消耗序列号. 因此, 一个数据报文段的序号仍是`seq=x+1`(刚刚服务器反馈回来的ack=x+1). 这时客户端通往服务器的TCP连接已经建立, 客户端进入`ESTAB-LISHED(已建立连接)`状态. 接着服务器收到TCP客户端进程的确认后, 也进入了`ESTAB-LISHED`状态, 服务器通过客户端的TCP链接也几经建立. 即建立双向连接成功.

为什么最后客户端还需要确认呢? 这主要是为了防止已失效的连接请求报文突然又传送到了服务器,因而产生错误.

# 正常情况下的考虑: 客户端发出连接请求, 但因为连接亲求报文丢失而未收到确认. 于是客户端再重传依次连接请求. 后来收到了确认, 建立了连接. 数据传输完毕以后, 就释放了连接.客户端共发了2个连接请求报文段, 其中第一个丢失了, 第二个到达了服务器, 没有"已失效的连接请求报文段"

# 假定异常的情况: 客户端发出的第一个连接请求报文段并没有丢失, 而是在某一个网络节点长时间滞留了, 以至于延误到连接释放以后的某个时间才到达服务器. 本来这是一个早已经失效了的报文. 但是服务器收到此报文以后,就误认为是客户端又发出的一次新得连接请求. 于是就向客户端发出确认报文段, 询问是否同意建立连接. 假定不采用报文握手, 那么只要服务器发出确认, 新得连接就建立了. 
由于现在客户端并没有发出建立得请求, 因此不会理睬服务器得确认, 也就不会向服务器发送数据. 但是服务器却以为新得运输管道连接已经建立了, 并一直等待客户端发来得数据. 那么服务器得许多资源就这样白白浪费了.

注意!!!: TCP协议规定只有ACK包可以携带数据. 所以第二次握手客户端到服务器的管道建立, 此时客户端可以同ACK包+数据一同传输给服务器, 只是需要增加一个序列号. 需要注意的是, 服务器一定要先确认第三次握手, 接着服务器才会接收数据.

5. 数据报协议UDP(User Datagram Protocol)

TCP连接释放(四报文握手):

提示: 这里以客户端主动发起的FIN结束请求为例. 数据传输结束后, 通信得双方都可释放连接. 因为三次报文的成功握手, 通信双方都处于`ESTABLISTH`状态.

第一次挥手: 客户端的应用进程先向其TCP发出连接释放报文, 并停止再发送数据, 主动关闭TCP连接.客户端把连接释放报文段首部的终止控制位FIN置1, 其序号`seq=u`, 它等于前面已经传送过的数据的最后一个字节的序号加1. 这时客户端进入`FIN-WAIT-1(等待终止1)`状态, 等待服务器的确认. (注意: TCP规定, FIN报文段即使不携带数据, 它也消耗一个序号)

第二次挥手: 服务器收到连接释放报文段后立即发出确认, 确认号是`ack=u+1`, 而这个报文段自己的序号是v, 它等于前面已经传送过的数据的最后一个字节的序号加1. 然后服务器就进入`CLOSE-WAIT(关闭等待)`状态. TCP服务器进程这时应该通知高层应用进程, 因而从客户端 -> 服务器这个方向的连接就释放了, 这时TCP连接处于(half-close)半关闭状态, 即客户端已经没有数据要发送了, 但服务器若要发送数据, 客户端任然需要接收. 也就是说, 从服务器 -> 客户端这个方向的连接并没有关闭, 这个状态可能会持续一段时间. 客户端收到来自服务器的确认后, 就要进入`FIN-WAIT-2(终止等待2)`状态, 等待服务器发出的连接释放报文段.

第三次挥手: 若服务器已经没有数据发送给客户端, 其应用进程就通知TCP释放连接. 这时服务器发出的连接释放报文段必须使用`FIN=1`. 现假定服务器的序号为w(在半关闭状态服务器可能又发送了一些数据). 服务器还必须重复上次已经发送过的确认号`ack=u+1`. 这时服务器就进入`LAST-ACk(最后确认)`状态, 等待客户端的确认.

第四次挥手: 客户端在收到服务器的连接释放报文段后, 必须对此发出确认. 再确认报文段中把ACk置1, 确认ack=w+1, 而自己的序号是seq=u+1(更具TCP标准, 前面发送过的FIN报文段要消耗一个序列号). 然后进入到`TIME-WAIT(时间等待)`状态. 注意!!, 现在TCP连接还没有释放掉. 必须经过时间等待计时期(TIME-WAIT timer)设置的时间2MSL后, 客户端才进入到`CLOSED`状态. 时间MSL叫做最长报文段寿命(MaXmun Segment Lifetime), RFC793建议设置为2分钟. 但这完全是从工厂上来考虑的, 对与现在的网络, MSL=2分钟可能太长了一些. 因此TCP允许不同的实现可更具具体情况进入到`CLOSED`状态. 因此, 从客户端进入到`TIME-WAIT`状态后, 要经过4分钟才能进入到`CLOSED`状态, 才能开始建立下一个新的连接. 当客户端撤销相应的传输控制块TCB后, 就结束了这次的TCP连接. 于此同时, 服务器只要收到了客户端发出的确认, 就进入`CLOSED`状态. 同样, 服务器在撤销相应的传输控制块TCB后, 就结束了这次的TCP连接. 我们注意到. 服务器结束TCP连接的时间要比客户端早一些.

为什么客户端在`TIME-WAIT`状态必须等待2MSL时间呢? 这里有2个理由.
第一个: 为了保证客户端发送的最后一个ACK报文段能够到达服务器. 这个ACk报文段很有可能丢失, 因而使处在`LAST_ACK`状态的服务器收不到对方以发送的FIN+ACK报文段的确认. 服务器会超时重传这个FIN+ACK报文段, 而客户端就能在2MSL时间内收到这个重传的FIN+ACK报文段. 接着客户端重传一次确认, 重新启动2MSL计时器. 最后客户端和服务器都才进入到`CLOSED`状态. 如果客户端在`TIME-WAIT`状态不等待一段时间, 而是在发送完ACK报文后立即释放连接, 那么就无法收到服务器重传的FIN+ACK报文段, 因而也不会在发送一次确认报文段. 这样服务器就无法按照正常步骤进入`CLOSED`状态.
第二个: 防止上一节提到的"已失效的连接亲求报文段"出现在本连接中. 客户端在发送完最后一个ACK报文段后, 再经过时间2MSL, 就可以使本链接持续的时间内所产生的所有报文段从网络中消失. 这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段.

TCP的保活计时器: 除时间等待计时器外,TCP还设有一个保活计时器(keepalive timer)。 设想有这样的情况:客户已主动与服务器建立了TCP连接。但后来客户端的主机突然出故障。显然,服务器以后就不能再收到客户发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就是使用保活计时器。服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两小时。若两小时没有收到客户的数据,服务器就发送一个探测报文段,以后则每隔75秒钟发送一一次。若一连发送10个探测报文段后仍无客户的响应,服务器就认为客户端出了故障,接着就关闭这个连接。

总结:

ip + mac ==> 标识全世界范围内独一无二的计算机, 或者也可以说ip也可以标识全时间范围内杜伊无二的计算机.(提示: 应为网络层协议ARP协议可以通过IP获取到对应计算机的MAC地址)

ip + port ==> 标识全始接范围内独一无二的基于网络通信的应用程序 

三次握手建立连接: 建立连接是为了传输数据做准备的, 三次握手即可. 因为不涉及到数据的传输所以请求SYN报文段和确认ACK报文段都可以合并成一次传输.

四次挥手断开连接: 断开连接中间不能合并成一次, 是因为涉及到数据的传输, 所以必须分成四次. 如果分成3次. 客户端收到服务器的ACK确认报文段直接断开 服务端 --> 客户端的连接, 服务器可能有数据传给客户端没有传完, 那么客户端就接收的服务器传输过来数据是不完整的.

TCP是可靠传输: 发送数据必须等待对方确认, 才会继续发送下一次的数据, 如果对方没有确认, 一端将会继续重传, 这就保证了数据的完整性. 如果对方回ACK确认报文段, 则刚刚传输的数据段可以进行清楚了.
	补充1: TCP连接之前, 如果服务器出现大量`SYN_RECV(同步收到)`状态, 表示服务器可能被SYN洪水攻击或者正处于高并发状态.
	补充2: TCP连接之后: 如果服务器大量处在`CLOSE-WAIt`状态(客户端发起的FIN)或者处在`TIME-WAIT`状态(服务器发起的FIN), 意味着服务器正处于高并发状态.
	应用场景: 对数据的安全性完整性有要求. 例如: 转账

TCP协议的半连接池:  
	半连接池存在于内存当中, 是控制客户端连接成功以后访问服务器资源的一种手段. 目的是为了防止过多客户端并发访问, 从而造成服务器内存溢出, 更严重甚至造成服务器瘫痪. 
	当许多客户端访问时, 如果服务器的半连接池中已经连接的用户已经满了, 那么就让后来的客户端用户进行等待, 直到半连接池中的腾出连接数, 那么进行访问的客户端用互就会按照列队的先后顺序获取到连接池中腾出的连接数, 从而访问服务器的资源.
	补充: 如果服务器大量处于`CLOSE_WAIT`状态(客户端发起的FIN)或者处于`TIME-WAIT`状态(服务端发起的FIN), 此时表明服务器正处于高并发状态.

UDP协议是不可靠的: 
	1) UDP是无连接的, 即发送数据之前不需要建立连接,(当然, 发送数据结束也没有连接可以释放), 因此减少了开销和发送数据之前的延时.
	2) UDP使用尽最大努力交付, 即不保证交付.
	应用场景: 对数据实时性很强或者及时性有要求. 例如: QQ聊天

八. 应用层

1. 应用层由来

用户使用的都是应用程序,均工作于应用层,互联网是开发的,大家都可以开发自己的应用程序,数据多种多样,必须规定好数据的组织形式

2. 应用层功能

规定应用程序的数据格式。

例:TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。

可以自定义协议:
    自定义协议需要注意的问题:
    1) 两大组成部分 ==> 头部 + 数据部分
        - 头部: 放对数据的描述信息. 比如: 数据要发给谁, 数据的类型, 数据的长度
        - 数据部分: 想要发送的数据
    2) 头部的长度必须固定
        - 因为接收端要通过获取固定长度的头部, 从而方便进一步获取数据部分的详细信息.

3. 捋清楚应用层协议和传输层协议之间的关系

提示: 这里的端口都是服务端的端口号.

# 基于TCP协议
HTTP = TCP + 80
HTTPS = TCP + 443
SSH = TCP + 22
telnet = TCP + 23
mysql = TCP + 3306

# 基于UDP协议
DNS = UDP + 53
DHCP = UDp + 68

4. 动态主机配置协议DHCP(Dynamic Host Configuration Protocol)

# DHCP作用: 它主要是给网络快速自动地分配IP地址。此外,它还可以给设备上配置正确的子网掩码,默认网关和DNS服务器信息。


# 连接到互联网的计算机的协议软件需要配置的4要素:
(1) IP地址;
(2) 子网掩码;
(3) 默认路由器的IP地址;(网关IP.)
(4) 域名服务器的IP地址。

# 配置4要素的两种方式:
    静态获取:即手动配置
    动态获取:通过dhcp协议动态获取相关ip参数。(注意: DHCP是基于udp)
    
    
# DHCP数据报格式介绍: (以太网头)(IP头)(UDP头)(dhcp数据报)
    <1> 最前面的”以太网头”,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。
    <2> 后面的”IP标头”,设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255
    <3> 最后的”UDP标头”,设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。
 
 
# 几个重要的问题介绍:
    为什么目标MAC是FF-FF-FF-FF-FF-FF? 这是一个广播地址, 在同一局域网内的所有主机都会收到发送端的数据报.
    为什么发出方的IP地址就设为0.0.0.0? 这种地址对本机来说, 它就是一个“收容所”,所有不认识的“三无”人员,一 律送进去. 原因一: 主机目前还没有自己的IP地址. 原因二: 让为自己分配地址的DHCP服务端的地址要找到自己. 因此它将IP数据报的源IP地址设为全0。
	为什么接收方的IP地址设为255.255.255.255? 在通过以上的FF广播以后, 局域网内的所有的主机都会接收到这个数据报, 但是都不知道是不是个自己的, 此时会拿到网络层解包, 发现该包的目标IP地址是255.255.255.255时,只有DHCP服务器会做出反应, 其他主机都将该包丢弃. 总结一句话说, 它就是表示要找DHCP服务器.
 
 
# DHCP动态为主机配置协议的过程:
	<1> 当主机需要被DHCP自动分配地址, 来达到网络通信目的. 主机就将以上的数据包构造完成后发出。在本机的数据链路层发现你的目标MAC地址是FF-FF-FF-FF-FF-FF主机就会通过广播的形式将数据报发送到本局域网内的所有主机中,发送出去以后, 同一个子网络的每台计算机都会收到这个包。接收方将二进制数据拿到数据链路层解包以后发现收到的目标MAC地址是FF-FF-FF-FF-FF-FF这种广播的通信方式,因此局域网内的所有主机都看不出是发给谁的,所以每台收到这个包的计算机,还必须将该数据包拿到网络层解包来分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道”这个包是发给我的”,而其它计算机就会丢弃这个包。
    <2> 接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个”DHCP响应”数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。
    <3> 新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数
    注意: DHCP服务器为请求方分配的IP地址, 这里的 ip 地址不仅仅是指主机的唯一标识,还指DNS、网关等 ip 地址。

5. 域名系统DNS(Domain Name System)

域名服务器(Domain Name Server)。在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器

img

# 13台根dns:
A.root-servers.net198.41.0.4美国
B.root-servers.net192.228.79.201美国(另支持[IPv6]
C.root-servers.net192.33.4.12法国
D.root-servers.net128.8.10.90美国
E.root-servers.net192.203.230.10美国
F.root-servers.net192.5.5.241美国(另支持[IPv6]
G.root-servers.net192.112.36.4美国
H.root-servers.net128.63.2.53美国(另支持[IPv6]
I.root-servers.net192.36.148.17瑞典
J.root-servers.net192.58.128.30美国
K.root-servers.net193.0.14.129英国(另支持IPv6)
L.root-servers.net198.32.64.12美国
M.root-servers.net202.12.27.33日本(另支持IPv6)

 
# 域名定义:http://jingyan.baidu.com/article/1974b289a649daf4b1f774cb.html

# 顶级域名:以.com,.net,.org,.cn等等属于国际顶级域名,根据目前的国际互联网域名体系,国际顶级域名分为两类:类别顶级域名(gTLD)和地理顶级域名(ccTLD)两种。类别顶级域名是                    以"COM"、"NET"、"ORG"、"BIZ"、"INFO"等结尾的域名,均由国外公司负责管理。地理顶级域名是以国家或地区代码为结尾的域名,如"CN"代表中国,"UK"代表英国。地理顶级域名一般由各个国家或地区负责管理。

# 二级域名:二级域名是以顶级域名为基础的地理域名,比喻中国的二级域有,.com.cn,.net.cn,.org.cn,.gd.cn等.子域名是其父域名的子域名,比喻父域名是abc.com,子域名就是www.abc.com或者*.abc.com.
一般来说,二级域名是域名的一条记录,比如alidiedie.com是一个域名,www.alidiedie.com是其中比较常用的记录,一般默认是用这个,但是类似*.alidiedie.com的域名全部称作是alidiedie.com的二级

为什么全球只有13台DNS根服务器?

# 注意: 13台根服务器并不是物理上的13台,而是逻辑上的13台,这也就是说,每一台逻辑上的根服务器由多台物理上的根服务器构成;

其中,13组根域名服务器以英文字母a到m顺序命名,域名格式为"a~m.root-servers.net",如"b.root-servers.net"
我们知道DNS协议是应用层协议,大多数情况下依赖传输层的UDP协议进行数据的传输, 仅在重试的情况下可能使用TCP协议。根据RFC 791规定,为保证UDP数据包传输成功率,尽量数据包控制在571字节以使数据包不会被分片传输。除去UDP数据包自身包头占用的字节数, DNS数据包被设计为不超过512字节.

统一资源定位符URL(Uniform Resource Locator)

形式: scheme:[//[user:password@]host[:port]][/]path[?query-string][#anchor]

提示: 方框内的是可选部分。
scheme:协议(例如:http, https, ftp)
user : password@用户的登录名以及密码
host:服务器的IP地址或者域名
port:服务器的端口(如果是走协议默认端口,http 80 or https 443)
path:访问资源的路径
query-string:参数,它通常使用键值对来制定发送给http服务器的数据
anchor:锚(跳转到网页的指定锚点位置)

补充:

# 不管是BS架构还是CS架构的互联网通信软件都是基于IP地址+端口工作的。
# 对于BS架构,从方便使用者的角度出发(不需要用户记住复杂无趣的ip,引入的域名的概念)。于是BS软件就需要DNS域名解析过程。
# 基于CS架构的软件不需要DNS。

九. socket

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

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

img

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

PID: 在不基于网络通行的情况下标识在本计算机上的唯一的进程

socket是在应用层与传输层之间抽象层, 并不是正正意义上的层次. socket下面传输层,网络层,数据链路层,物理层是由操作系统控制. 应用层是由应用程序控制.socket把基于网络通信的应用程序由传输层,网络层,数据链路层,物理层的复杂处理过程进行封装, 提供简单的接口给用户使用.

补充: 我们所见到的基于网络通信的程序, 本质都是由不同编程语言中的socket编写的, 也称之它们为socket程序.例如: 浏览器

十. 网络通信流程

<1> 本机获取

  • 本机的IP地址:192.168.1.100
  • 子网掩码:255.255.255.0
  • 网关的IP地址:192.168.1.1
  • DNS的IP地址:8.8.8.8

<2> 打开浏览器,想要访问Google,在地址栏输入了网址:www.google.com。

<3> dns协议(基于udp协议)

<4> HTTP部分的内容,类似于下面这样:

GET / HTTP/1.1
Host: www.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1) ……
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: … …

我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中。

<5> TCP协议

TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。

TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。

<6> IP协议

然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。

IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。

<7> 以太网协议

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560。

img

<8> 服务器端响应

经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。

根据IP标头的序号,Google将四个包拼起来,取出完整的TCP数据包,然后读出里面的”HTTP请求”,接着做出”HTTP响应”,再用TCP协议发回来。

本机收到HTTP响应以后,就可以将网页显示出来,完成一次网络通信。好,

posted @ 2020-04-16 21:53  给你加马桶唱疏通  阅读(438)  评论(0编辑  收藏  举报