总结——计算机网路
总结——计算机网络
计算机网络分层
分层
计算机网络有两种分层方式,第一种就是广泛使用的5层因特网协议栈,也即TCP/IP网络协议,第二种即为7层ISO/OSI参考模型(已淘汰),故这里只考虑5层分法:
-
应用层:因特网的应用层是网络应用程序及它们的应用层协议存留的地方。应用层协议分布在多个端系统上,而一个端系统中的应用程序使用协议与另一个端系统中的应用程序交换分组信息,这种分组信息成为报文(message)。应用层主要的协议有:
- HTTP协议:提供Web文档的请求和传送(传输层协议为TCP)。
- SMTP协议:提供了电子邮件报文的传输。
- FTP协议:提供两个端系统之间的文件传送。
- DNS:域名系统(传输层协议为UDP)。
-
传输层:因特网的传输层在应用程序端点间传送应用层报文,为运行在不同主机上的进程之间提供了逻辑通信,网络层的数据报(见下网络层)通过网络层发送到目标计算机后,应用程序在传输层定义逻辑端口,确认身份后,将数据报交给应用程序,实现端口与端口间的通信,在传输层中传输的分组称为报文段(segment)。在因特网中,传输层有两种典型协议:
- TCP协议:提供面向连接的服务,为可靠传输,包括了报文向目的地的确保传递和流量控制(发送方/接收方速率匹配),TCP也将长报文划分为短报文,并提供拥塞控制机制,即当网络拥塞时,源抑制其传输速率。
- UDP协议:提供面向无连接的服务,为不可靠传输,没有流量控制,也没有拥塞控制,该协议只是在IP数据报上增加端口等部分信息,多用于视频通信、电话会议等(即使少几帧数据也无伤大雅)。
进程到进程的数据交付(即后面提到的多路复用和多路分解)和差错检查是两种最低限度的传输层服务,也是UDP协议所能提供的仅有的两种服务。
-
网络层:因特网的网络层负责将IP数据报(datagram)从一台主机移动到另一台主机,提供了主机之间的逻辑通信。根据IP定义网络地址,区分网段,子网内根据地址解析协议(ARP)进行MAC寻址,子网外进行路由转发数据报。网络层协议主要用:
- 网际协议IP:定义了在数据报中的各个字段以及端系统和路由器如何作用于这些字段。
- 路由选择协议:决定如何选择路由。
-
链路层:链路层定义数据帧(frame), 写入源和目标机器的物理地址、数据、校验位来传输数据,链路层的任务是将整个帧从一个网络元素移动到邻近的网络元素。链路层的主要例子包括:
- 以太网
- WiFi
-
物理层:物理层的任务将链路层更进一步细化,将帧中的一个个比特从一个节点移动到下一个节点。该层协议与链路层的实际传输相关,如,对于以太网来讲有许多物理层协议:
- 双绞铜线
- 同轴电缆
- 光纤
封装
在因特网中的报文传输体现了封装,在发送主机端,一个应用层报文(上图中M)被传送给运输层,运输层收取上层报文并添加附加信息(上图Ht,即所谓运输层首部信息),该首部将被接收端的运输层使用,应用层报文和运输层首部信息一起构成了运输层报文段,也就是说运输层报文段封装了应用层报文。运输层则向网络层传递该报文段,网路层增加了如源和目的端系统地址等网络层首部信息(上图Hn),生成网络层数据报。数据报到链路层,加上链路层首部信息(上图Hl)成为链路层帧。
所以说,在每一层,一个分组具有两种类型的字段:首部字段和有效载荷字段,而有效载荷通常即为来自上一层的分组。
一些重要概念
套接字Socket
网络应用程序由成对的进程组成,这些进程通过网络相互发送报文,也就是说网络应用程序由通信进程对组成,每对中的两个进程相互发送报文,从一个进程向另一个进程发送的报文必须通过网络,而进程通过一个称为套接字(Socket)的软件接口向网络发送报文和从网络接收报文。
套接字是一台主机内应用层与传输层之间的接口,应用程序开发者可以控制套接字在应用层端的一切,但是对该套接字的传输层端几乎没有控制权,应用程序开发者对传输层的控制仅限于:
- 选择传输层协议(TCP / UDP,上图假定该进程选择的传输层协议为TCP协议);
- 设定几个传输层参数,如最大缓存和最大报文段擦汗高难度等。
所以作为程序开发者,对于计算机网络中的协议我们主要需要掌握的就是应用层协议即传输层协议,再了解了解网络层寻址,再往下的协议事实上和程序开发已经关系不大。需要注意的是:
- 一个UDP套接字是由一个二元组全面标识的,二元组为(目的IP地址,目的端口号);
- 一个TCP套接字是由一个四元组来标识的,四元组为(源IP地址,源端口号,目的IP地址,目的端口号)
多路复用和多路分解
这是连个传输层中的概念,传输层的多路复用和多路分解,也就是将由网络层提供的主机到主机交付服务延伸为运行在主机上的应用程序提供进程到进程的交付服务。在上面我们了解到,一个进程(即网络应用的一部分)有一个或多个套接字,套接字就是从网络向进程传递数据和从进程向网络传递数据的门户,所以比如说接收主机的运输层实际上并没有直接将数据交付给进程,而是将数据交付给了一个中间套接字(UDP套接字/TCP套接字),而每个套接字都有唯一的标识符,所以给出多路分解和多路复用的定义如下:
- 多路分解(demultiplexing):将运输层报文段中的数据交付到正确的套接字的工作。
- 多路复用(multiplexing):在源主机从不同套接字中收集数据块,并未每个数据块封装上首部信息(为了用于多路分解)从而生成运输层报文段,然后将报文段传递到网络层,这些工作称之为多路复用。
端口号是一个16比特的数,大小在
0~65535
之间,0~1023
为周知端口号(well-known port number),因为它们保留给了诸如HTTP(80
端口)、FTP(21
端口)这些服务,故开发程序时不要选择1024
以内的端口号。
重要协议
HTTP协议
概述
Web是一种客户—服务器应用,它允许客户按照需求从Web服务器获得文档,而Web的应用层协议即为HTTP协议(HyperText Transfer Protocol,超文本传输协议),HTTP协议定义了在浏览器和Web服务器之间传输的报文格式和序列,其默认端口为80
。HTTP由两个程序实现:一个客户程序和一个服务器程序,客户程序和服务器程序运行在不同端系统中,通过HTTP报文进行会话,而HTTP协议就定义了这些报文的结构以及客户和服务器进行报文交换的格式。
当一个用户请求Web资源时,浏览器向服务器发出对该资源的HTTP请求报文,而服务器接收请求并用包含资源的HTTP响应报文进行响应。
HTTP使用TCP协议作为它的支撑传输层协议,HTTP客户首先发起一个与服务器的TCP连接,一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问TCP。一旦客户向它的套接字接口发送了一个请求报文,则该报文就脱离了客户的控制而进入了TCP的控制,而TCP为HTTP提供了可靠的数据传输服务,所以HTTP协议不用担心数据的丢失,也不需要关心数据在因特网中的传输,这都是低层协议的工作。需要注意的是HTTP服务不保存客户的任何信息,即如果一个客户在短时间内向服务器请求了同一个资源两次,第二次的时候服务器仍会响应资源,就像客户没有请求过第一次一样,即HTTP是一个无状态协议,
HTTP报文格式
- 请求报文:
例如对百度的首页进行访问,浏览器会向服务器发送如下的请求报文:
可以看到,由于是GET
请求,故该请求报文不包含实体体。
- 响应报文:
同样拿百度首页服务器响应的报文举例:
而其实体体中确实为HTML文本:
HTTP请求方法
HTTP1.0 定义了三种请求方法: GET
, POST
和 HEAD
方法。
HTTP1.1 新增了六种请求方法:OPTIONS
、PUT
、PATCH
、DELETE
、TRACE
和 CONNECT
方法。
常用HTTP状态码
HTTP状态码分为如下5类:
分类 | 描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见的状态码有:
-
200
:请求成功。 -
204
:无内容。服务器成功处理,但未返回内容。 -
301
:资源(网页等)被永久转移到其它URL。 -
302
:临时移动。与301
类似。但资源只是临时被移动。客户端应继续使用原有URI。 -
404
:请求的资源(网页等)不存在。 -
408
:服务器等待客户端发送的请求时间过长,超时。 -
500
:内部服务器错误。 -
502
:作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应,网关错误。
UDP协议
概述
UDP(User Datagram Protocol,用户数据报协议)是传输层的协议,功能即为在网络层IP数据报服务之上增加了最基本的服务:多路复用和多路分解以及差错检测。除了复用/分解功能以及少量的差错检测外,UDP几乎没有对IP增加别的东西。虽然TCP提供了可靠的数据传输,而UDP不能提供,但是很多场合下还是需要用UDP作为传输层协议,主要原因有以下几点:
- 采用UDP时,只要应用进程将数据传递给UDP,UDP就会将数据打包为UDP报文段并立即传递给网络层,而TCP具有拥塞控制机制,当源和目的主机间拥塞时会遏制TCP的发送方。一些实时应用如网络电话通常要求最小的发送速率,不希望过分延迟报文段的传递,并且允许少量数据丢失,这显然传输层协议更应选择UDP。
- UDP无需建立连接,不需要任何准备就能进行数据传输,因此不会引入建立连接的时延。
- UDP无连接状态。TCP需要在端系统中维护连接状态,而UDP不维护连接状态,自然也不跟踪相关参数。
- UDP分组首部开销小。TCP报文段都有20字节的首部开销,而UDP仅有8字节。
UDP报文段结构
UDP首部8个字节,共4个字段,每个字段都为2个字节,分别为:
- 源端口: 源端口号,需要对方回信时选用,不需要时全部置0。
- 目的端口:目的端口号,在终点交付报文的时候需要用到。
- 长度:UDP的数据报的长度(包括首部和数据)其最小值为8(只有首部)。
- 校验和:检测UDP数据报在传输中是否有错,有错则丢弃,该字段是可选的,当源主机不想计算校验和,则直接令该字段全为0。
TCP协议
概述
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接、确保数据在端到端间可靠传输的协议。面向连接是指在发送数据前,需要建立一条虚拟链路,然后让数据在这条链路上“流动”完成传输。为了确保数据的可靠传输,不仅需要对发出的每一个字节进行编号确认,确保一个进程从其接收缓存中读出的数据流无损换、无间隙、非冗余和按序的数据流,即接收的字节流和连接另一端系统发送出的字节流完全相同。在出现超时情况时还要进行数据的重传。还需要通过实现滑动窗口和拥塞控制等机制,避免网络状况恶化而最终影响数据传输。
TCP报文段结构
注意,上图中紫色的选项也为TCP报文段首部的一部分,正因为有该变长部分,所以才会有4位
的首部长度,TCP首部至少会有20字节,其各字段如下:
- 协议第一行(蓝色)的两个端口号各占两个字节,分别标识源主机和目标主机的端口号,用于多路复用/分解,这两个端口号与IP数据报中的源IP地址和目标IP地址所组成的四元组可以唯一标识一条TCP连接。
- 协议第二行和第三行(橙色)分别为***和确认号,***指所发送报文段的数据部分第一个字节的***,确认号是指期望收到来自对方的下一个报文段中数据部分的第一个字节的***。
- 4比特的首部长度字段,由于存在变长选项,需要该字段指示TCP首部长度,但是TCP的选项字段通常为空,所以TCP首部的典型长度为20字节。
- 6比特的标志位(FLAG):分别为
SYN
、ACK
、FIN
、URG
、PSH
、RST
,都是置1
时表示有效,重点关注SYN
、ACK
、FIN
:-
SYN
(Synchronized Sequence Numbers):用于建立连接时的同步信号; -
ACK
(Acknowledgment):用于对收到的数据进行确认,所确认的数据由确认***表示; -
FIN
(Finish):表示后面没有数据需要发送,通常意味着所建立的连接需要关闭了。
-
- 接收窗口字段:该字段用于流量控制。
- 校验和字段:同UDP的校验和字段一样用于校验数据。
TCP建立连接——三次握手
首先注意,本文中ack
代表的是TCP报文段中的确认号,而ACK
代表的是TCP报文段中FLAG中的标志位。
上图展示了正常情况下通过三次握手建立TCP连接的过程,客户主机需要服务器主机一直打开某端口进行监听并等待数据传输,否则将无法正常建立连接,三次握手的详细步骤如下:
- 客户端的TCP首先向服务端的TCP发送一个特殊的TCP报文段,该报文段不含应用层数据,且该报文段首部中的
SYN
标志位置1
,这个特殊的TCP报文段称为SYN报文段,表示希望建立连接,假设该报文段中***是x
。 - 包含TCP SYN报文段的IP数据报到达服务器主机后,服务器提取出该报文段,通过
SYN
服务器得知这是一个建立连接的请求,服务器为该TCP连接分配TCP缓存和变量,并向客户端发送一个响应报文段表示允许连接,该报文段也不包含应用层数据,且将SYN
和ACK
标志位均置位1
,该允许连接的报文段称为SYNACK报文段,假设该报文段的***为y
,而确认号必须是x + 1
,表示收到了客户端发来的SYN
。 - 客户端收到SYNACK报文段后,也要给该连接分配TCP缓存和变量,然后需要对收到的响应包进行确认,确认包中
ACK
置1
,因为连接已经建立了,所以SYN
位置0
,并将确认号设置为y + 1
, 表示收到了来自服务器端的SYNACK
,注意该确认包已经可以在有效载荷中携带客户到服务器的数据。
客户端和服务器端在三次握手过程中的状态如下表:
为什么三次握手?两次握手行不行?
三次握手主要有两个目的:
-
信息对等:就像上面的表格显示一样,双方只有都确定了4类信息,即自己和对方均具有收发报文段的能力,才能建立连接。
-
防止超时:TTL(Time To Live)网络报文的生存时间往往会超过TCP请求超时时间,如果两次握手就可以创建连接,就会出现如下的TCP脏连接问题,但是如果是三次握手,当服务器收到该延时请求报文后同意创建连接,但因为客户端并不是
SYN_SENT
(即发送了SYN报文段)状态,故客户端会将该SYNACK报文段丢弃,而服务器端由于长时间未收到确认包,则会最终超时导致连接创建失败,就不会出现脏连接问题。
TCP断开连接——四次挥手
四次挥手具体过程如下:
- 客户端想要关闭连接,待本方数据发送完毕后,传递
FIN
信号给服务器端。 - 服务器端应答
ACK
,告诉客户端可以断开,但是需要等待服务器端处理完数据,然后客户端就处于了半关闭状态FIN_WAIT_2
,即客户端无法再发送新的数据。 - 服务端给做好关闭连接前的准备工作后,发送
FIN
给客户端,然后服务端也进入半关闭状态FIN_WAIT_2
。 - 客户端发送对服务端
FIN
的ACK
后,进入定时等待TIME_WAIT
状态,若经过规定时间未收到服务器端传来的报文,则确定服务器端已收到客户端发送的ACK
报文端,然后TCP连接正式释放。
TCP的状态序列
IP协议
概述
IP协议是面向无连接、无状态的,没有额外的机制保证发送的包是否有序到达。IP协议首先规定了IP地址格式,该地址相当于逻辑意义上进行了网络的划分,给每台计算机额外设置了一个唯一的详细地址,IP地址属于网络层,主要功能是在WLAN(无线局域网)内进行路由寻址。现在有两个版本的IP在使用——IPv4和IPv6。
IPv4报文格式
这里解释几个比较重要的关键字段:
- 头长度:因为一个IPv4数据报可以包含一些可变长度的选项(选项也是数据报首部的一部分),故需要用这4比特来确定IP数据报中有效载荷实际开始的地方,大多数IP数据包不包含选项,故一般IP数据报具有20字节的首部。
- 寿命:Time-To-Live,用来确保数据报不会永远在网络中循环(如由于长时间的路由选择环路),每当一台路由器处理该数据包时,TTL字段值减1,若TTL字段减为0,则该数据报丢弃。
- 挂载协议标识:即上层(传输层)协议标识,值为6表明数据要交给TCP,值为17表明数据要交给UDP。
注意一个IP数据报通常有20字节的首部,若数据报承载一个TCP报文段,则每个数据报共承载了40字节长度的首部以及应用层报文。
IPv6数据报格式
IPv6的特点:
- IPv6将地址容量从原来的32比特增加到了128比特,这样就确保了全世界不会用尽IP地址。
- 简化高校的40字节首部。许多IPv4中的字段都已被舍弃,该首部只包含绿色的8字节以及16字节的源IP地址和16字节的目标IP地址。
对于几个重要的关键字段进行解释:
- 下一个首部:和IPv4首部中的挂载协议标识相同。
- 跳限制:和IPv4首部中的寿命相同。
YqEjLsG-1601475630778)]
IPv6的特点:
- IPv6将地址容量从原来的32比特增加到了128比特,这样就确保了全世界不会用尽IP地址。
- 简化高校的40字节首部。许多IPv4中的字段都已被舍弃,该首部只包含绿色的8字节以及16字节的源IP地址和16字节的目标IP地址。
对于几个重要的关键字段进行解释:
- 下一个首部:和IPv4首部中的挂载协议标识相同。
- 跳限制:和IPv4首部中的寿命相同。
对酒当歌,人生几何!譬如朝露,去日苦多。。。