TCP/IP协议

 

基础

协议层

OSI参考模型

名称 | 功能

  • 应用层 电子邮件协议
    远程登录协议
    文件传输协议
    表示层 接受不同表现形式的信息,如文字流、图像、声音等 <-> 网络标准数据格式
    会话层 何时建立连接,何时断开连接以及保持多久的连接
    传输层 是否有数据丢失?确保数据被可靠地传送到目标地址。
    分清楚哪些程序与哪些程序进行通信,识别这些应用程序的是端口号。
    网络层 地址管理与路由选择
    数据链路层 数据帧 <-> 比特流
    物理层 比特流 <-> 电子信号

TCP/IP协议

协议 | 功能负责

  • 应用层 应用程序
    传输层 操作系统
    网络层 操作系统
    数据链路层 设备驱动,网络接口

TCP/IP: 是IP,TCP,UDP,HTTP,ICMP,TELNET,SMTP…协议的集合。

传输

路由器传输

    【主机A】                                                                 【主机B】
|---=       应用层|                                                     |---=       应用层|
    |                                                                       ^
    v                                                                       |
|----=      表示层|                                                     |----=      表示层|
    |                                                                       ^
    v                                                                       |
|-----=     会话层|                                                     |-----=     会话层|
    |                                                                       ^
    v                                                                       |
|------=    传输层|                                                     |------=    传输层|
    |                                                                       ^
    v                                     【路由器】                          |
|-------=   网络层|                 ——> |-------=| 网络层 ———            |-------=   网络层|
    |                              |                       |                ^
    v                              |                       v                |
|--------=  数据链路层|         |--------=| 数据链路层 |--------=|        |--------=  数据链路层|
    |                              ^                       |                ^
    v                              |                       v                |
|---------= 物理层|            |---------=| 物理层  |---------=|         |---------= 物理层|
    |                              ^                       |                ^
    |______________________________|                       |________________|

硬件

设备 作用
网卡 使计算机连网的设备
中继器 从物理层上延长网络的设备
网桥/2层交换机 从数据链路层上延长网络的设备
路由器/3层交换机 通过网络层转发分组数据的设备
4~7层交换机 处理传输层以上各层网络传输的设备
网关 转换协议的设备

概念

  • 分组交换协议:分组交换是指将大数据分割为一个个叫做包的较小单位进行传输。
  • 电路交换与分组交换。
  • MAC地址与IP地址:IP地址具有层次性,用于寻址。MAC寻址参考的叫地址转发表(交换机用),IP寻址参考的叫路由控制表(路由器用)。
  • HTTP:(HyperText Transfer Protocol)是浏览器与服务端之间的协议,所传输的数据主要是HTML(HyperText Markup Language)。www中的HTTP属于OSI应用层的协议,而HTTP属于表示层的协议
  • ARP:(Address Resolution Protocol)地址转换协议。建立于互联网中互相信任,ARP攻击。
  • ICMP:侦测远端主机是否存在,建立及维护路由资料,重导资料传送路径,资料流量控制。长时间、连续、大量发送ICMP数据包,导致ICMP风暴
  • DHCP:动态主机设置协议,是局域网的网络协议。使用UDP工作,主机申请地址时,用于动态分配地址。
  • 网络拓扑:总线型,环形,星型,混合型(网状+星型)。

数据包

结构

TCP/IP

接收处理

网络结构(以太网驱动)的处理:

  • 主机收到以太网包以后,首先从以太网的包首部找到MAC地址判断是否为给自己的包。
  • 如果不是则丢弃。如果是,就查找以太网包首部中的类型域从而确定数据类型。
  • 如果是IP包,就将数据传送给处理IP的子程序。如果是其它如ARP的协议,就把数据传给ARP处理。如果是无法识别的协议类型,则丢弃数据。

IP模块的处理:

  • 判断包首部的IP地址是否与自己的IP地址匹配。
  • 如果是,则接受数据并中查找上一层的协议。
  • 如果上一层是TCP就将IP包首部之后的部分传给TCP处理。如果是UDP则将IP包首部后面的部分传给UDP处理。
  • 对于路由器,接收端往往不是自己的地址,此时,需要借助路由控制表,查找应该送达的主机或路由器后,转发数据。

TCP模块的处理:

  • TCP模块中,首先会计算一下校验和,判断数据是否被破坏。
  • 然后检查是否在按照序号接受数据。
  • 最后检查端口号,确定具体的应用程序。
  • 数据接受完毕后,接收端则发送一个”确认回执”给发送端。如果这个回执信息未能达到发送端,那么发送端会认为接收端没有收到数据而一直反复发送。
  • 数据被完整地接受以后,会传给由端口号识别的应用程序。

应用程序的处理:

  • 接收端应用程序会直接接收发送端发送的数据。
  • (例:电子邮件)
  • 通过解析数据可以获知邮件的收件人地址是x的地址。如果主机B上没有x的邮件信箱,那么主机B返回给发送端一个”无此收件地址”的报错信息。如果主机B上恰好有x的收件箱,主机B和收件人x能够受到电子邮件的正文。

数据链路层

MAC地址

MAC地址长48 bit,使用网卡,一般烧入ROM中。

  • 第1位:单播地址(0)/多播地址(1)
  • 第2位:全局地址(0)/本地地址(1)
  • 第3~24位:由IEEE管理并保证各厂家之间不重复
  • 第25~48位:由厂商管理并保证产品之间不重复

MAC地址一般用十六进制数表示,比特流实际在网络中的流动顺序如下:

PS:MAC一般是唯一的,但不是一定的。实际上,即使MAC地址相同,只要不是同属一个数据链路就不会出现问题。

IP地址和MAC地址缺一不可?

数据链路上只要知道接收端的MAC地址,就知道是准备发送给主机B的,还需要知道它的IP地址吗?

(只要知道了IP地址,即使不做ARP,只要在数据链路上做一个广播不就能发给主机B了吗?)

例如,主机A想要发送数据报给主机B时必须得经过路由器C。即使得知主机B的MAC地址,由于路由器C会隔断两个网络,还是无法实现直接从主机A发送数据包给主机B。

假定MAC地址就用广播地址,那么路由器D也会收到该广播消息。于是路由器D又将消息转发给路由器C,导致数据包被重复发送两次。

在以太网上发送IP包时,"下次要经由哪个路由器发送数据报"这一信息非常重要。而这里的”下一个路由器”就是相应的MAC地址。

如果全世界的设备都使用MAC地址相连,那么网桥在习得之前就得向全世界发送包,会造成巨大的网络流量,网桥不得不维护一张巨大的表格来维护所有的MAC地址。

介质

共享介质型网络 - 介质访问控制方式:争用方式,令牌传递方式。 非共享介质网络:网络中每个站直连交换机,由交换机负责转发数据帧。

环路检测技术

  • 生成树方式:每个网桥每1~10秒内互相交换BPDU(Bridge Protocol Data Unit)包,从而判断哪些端口使用,哪些不使用,以便消除环路。一旦发生故障,则自动切换通信线路,利用哪些没有被使用的端口继续进行传输。例:以某一网桥为构造数的根,并对每个端口设置权重,指定优先使用哪些端口以及发生问题时该使用哪些端口。弊端:发生故障切换网络需要几十秒时间。
  • 源路由法:(IBM提出,以解决令牌环网络问题。)该方式可以判断发送数据的源地址是通过哪个网桥实现传输的,并将帧写入RIF(Routing Information Field)。网桥则根据这个RIF信息发送帧给目标地址。

IP协议

IP(Internet Protocol)网际协议,主要负责将数据包发送给最终的目标计算机。

TCP/IP的核心是网络层,这层主要由IP(Internet Protocol)和ICMP(Internet Control Message Protocol)两个协议组成。

主机:配置有IP地址,但不进行路由控制的设备。 路由器:既配有IP地址又具有路由控制能力的设备。

IP作用

IP大致分为三大作用模块:IP寻址,路由,IP分包与组包。

IP寻址

计算机通信中,为了识别通信对端,必须有一个类似于地址的识别码进行标识。

数据链路的MAC地址,正是用来标识同一链路中的不同计算机的一种识别码。

作为网络层中,也有这种地址信息,叫做IP地址。用于在连接到网络中的所有主机中识别出进行通信的目标地址。

在TCP/IP通信中的所有主机或路由器必须设定自己的IP地址。在网桥或交换集线器等物理层或数据链路层数据包转发设备中,不需要设置IP地址,因为这些设备只负责将IP包转化为0,1比特流转发等,不需要IP协议。

路由控制

路由控制(Routing)是将分组数据发送到最终目标地址的功能。

路由控制表:为了将数据包发给目标主机/路由器,所有主机/路由器都维护着一张路由控制表。该表记录IP数据在下一步应该发给哪个路由器。IP包将根据这个路由表在各个数据链路上传输。

默认路由:如果一张路由表中包含所有的网络及其子网的信息,将会造成无端的浪费。这时,设置默认路由,是指路由表中任一个地址都能与之匹配的记录。默认路由标记为0.0.0.0/0,这里的0.0.0.0不是指IP地址,由于后面的是/0,所以并没有标识IP地址。

主机路由IP地址/32也被称为主机路由(Host Route),(例如,192.168.153.15/32就是一种主机路由。)意味着要基于主机上网卡上配置的IP地址本身,而不是基于该地址的网络地址部分进行路由。主机路由多被用于不希望通过网络地址路由的情况。

回环地址:是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。计算机使用特殊的IP地址127.0.0.1localhost)作为回环地址。使用这个IP或主机名时,数据包不会流向网络。

分包与组包

IP是实现多个数据链路之间通信的协议。不同数据链路有个最大的区别,就是它们各自的最大传输单位(MTU:Maximum Transmission Unit)不同。

IP的上一层可能会要求传送比这些MTU更多字节的数据,因此必须在线路上传送比包长还要小的MTU。

为了解决这个问题,IP进行分片处理。将较大的IP包分成多个较小的IP包。分片的包到了对端目标以后再被组合起来传给上一层。

路径MTU发现:是指从发送端主机到接收端主机之间不需要分片时最大MTU的大小,即路径中存在的所有数据链路中最小的MTU。避免数据在中途的路由器被分片,如果分片丢失将造成整个IP数据作废。路径MTU发现降低了路由器过多的处理负担。

IP属于无连接型

IP面向无连接,即在发包之前,不需要建立与对端目标地址之间的连接。

若没有做好准备,很可能会错过一些该收的包。因此面向无连接的方式下可能会有很多冗余的通信。

为什么IP要采用无连接呢?

  • 主要有2点原因:为了简化,为了提速。有连接处理相对复杂。甚至每个连接本身就是一个相当繁琐的事情。需要有连接时,可以委托上一层提供此项服务。

为了提高可靠性,上一层的TCP采用面向有连接型。

IP提供尽力服务(Best Effort),意指”为了把数据包发送到最终目标地址,尽最大努力。”然而它并不做”最终收到与否的验证。”

IP数据包在途中可能会发生丢包,错位,数据量翻倍等问题。

IP负责将数据发给目标主机,TCP负责保证对端主机确实接收到数据

为什么不让IP具有可靠传输的功能?(将这两种协议合并到一起)

  • 如果要一种协议规定所有的功能和作用,那么该协议的具体实施和编程就会变得非常复杂,无法轻易实现。
  • 网络通信中如果能进行有效的分层,就可以明确TCP与IP各自协议的最终目的,也有利于后续对这些协议进行扩展和性能上的优化。

IP地址

IPv4地址由32位正整数表示。

$ 2^{32} = 4294967296 $,最多可以允许43亿台计算机连接网络。

IP地址由网络标识(网络地址)和主机标识(主机地址)组成

——————————————————————————————————————————————————————————
|网络标识        主机标识           网络标识        主机标识   |
|192.168.128.   10     /24       192.168.128.   11     /24|
———————————————————————————————————————————————————————————
|网络标识        主机标识                                    |
|192.168.144.   10     /24                                |
———————————————————————————————————————————————————————————

网段不同则必须配置不同的值。(如:192.168.128)

路由器只要一看到IP地址的网络标识就可以进行转发。

ip地址后面/24表示掩码位为24,子网掩码是255.255.255.0的ip地址。

IPv6使用128比特,每16比特为一组,以’:’隔开。

IP地址的分类

IP地址分为四个级别,分别为A类、B类、C类、D类。根据IP地址中从第1位到第4位对其网络标识和主机标识进行区分。

分配IP主机地址的注意:即要用比特位表示主机地址时,不可以全部为0或全部为1。因为全部为0表示对应的网络地址IP地址不可获知的情况下才使用,全部为1的主机地址通常作为广播地址。(C类地址每个网段最多只能有254个主机地址)

  • 地址的缺乏,放弃IP地址的分类,采用任意长度分割IP地址的网络标识和主机标识,称为CIDR(无类型域间选路)。
  • 掩码长度固定,难以架构一个高效的网络结构。提出可随机修改子网掩码长度的机制,称为VLSM(可变长子网掩码)。

全局地址与私有地址

  • IP地址不足,出现的新技术,不要求为每台主机或路由器分配一个固定的IP地址,而是在必要的时候只为相应数量的设备分配唯一的IP地址。
  • 私有IP地址范围:10.0.0.0~10.255.255.255(A类),172.16.0.0~172.31.255.255(B类),192.168.0.0~192.168.255.255(C类)。
  • 除私有地址外的IP地址,称为全局IP。
  • 私有IP地址+NAT技术:私有IP最早没有计划连接互联网,用于独立网络。然而,能够互换私有IP与全局IP的NAT(网络地址转换)技术出现后,配有私有IP的主机与配有全局地址的互联网主机实现了通信。

大部分学校,家庭,公司内部采用每个终端设置私有IP,而在路由器(宽带路由器)或必要的服务器上设置全局IP地址的方法。配有私有IP的地址主机连网时,则通过NAT进行通信。

NAT不仅能够解决IP地址不足的问题,而且还能够有效避免来自网络外部的攻击,隐藏并保护网络内部的计算机。(这是由于,NAT之内的PC联机到Internet上时,所显示的IP是NAT主机的公共IP。在外界进行端口扫描时,就侦测不到源Client端的PC。)

广播地址

广播地址用于在同一链路中相互连接的主机之间发送数据包。将IP地址中的主机地址部分全部设置为1,就成了广播地址。

例:172.20.0.0,二进制表示:10101100.00010100.00000000.00000000,将主机部分全改为1,就形成广播地址:10101100.00010100.11111111.11111111,则为172.20.255.255。

IP协议相关技术

IP旨在让最终目标主机收到数据包,但这一过程仅有IP是无法实现通信的。

必须还有能够解析主机名称解析MAC地址的功能,以及数据包在发送过程中异常情况处理的功能,以及其它功能。

DNS

  • IP地址不便记忆,DNS可以将那串字符串自动转换为具体的IP地址。
  • DNS系统,这个系统中主机的管理机构可以对数据进行变更和设定,它维护一个用来标识组织内部主机名IP地址之间对应关系的数据库。

ARP

  • 以目标IP地址为线索,用来定位下一个应该接收数据分包的网络设备对应的MAC地址。

RARP:是ARP的反操作,用于寻找MAC地址的IP地址。(需要RARP服务器响应)

ICMP

用于确认IP包是否成功送达目标地址,通知在发送过程当中IP包被废弃的具体原因,问题诊断。

DHCP

用于自动设置IP地址,同一管理IP地址分配。

家用路由器一般兼备DHCP功能,大规模组织机构才会有专用的DHCP服务器分配IP。

NAT

  • 用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术。
  • 可以实现一个全局IP地址与多个主机通信。(多个主机共用一个全局IP地址,在使用同一个端口通信时,可以在端口号上区分)

其它

IP隧道:网络A,B,C依次传递数据。如果网络A,B使用IPv6,处于中间网络B只支持IPv4的话,网络A和网络B无法直接进行通信。可以采用IP隧道功能实现,原理是在数据的IP首部前添加IPv4的IP首部。

IP多播:通过确认接收端是否存在,来给指定的地址发送多播消息。通过MLD(Multicast Listener Discovery)实现,有两大作用,向路由器表明想要接收多播消息,向交换集线器通知想要接收多播的地址。

IP任播:指为那些提供同一种服务的服务器配置同一个IP地址,并与最近的服务器进行通信的一种方法。(例如,DNS域名服务器)

TCP与UDP

区别

TCP(Transmission Control Protocol):

  • 是有连接的传输层协议,可以保证两端通信主机之间的通信可达。
  • 为了建立与断开连接,有时需要至少7次的发包收包。

UDP(User Datagram Protocol):

  • 是无连接的传输层协议,不会关注对端是否真的受到了传输过去的数据。
  • 如果需要检查对端是否收到分组数据包,或对端是否连接到网络,则需要在应用程序中实现。

TCP为提供可靠性传输,实行“顺序控制”或“重发控制”机制。还具备“流量控制”,“拥塞控制”,提高网络利用率等众多功能。

套接字(Socket)

应用在是使用TCP或UDP时,会用到操作系统提供的类库,套接字(socket)的API。

应用程序利用套接字,可以设置对端IP地址,端口号,实现数据发送与接收。

端口号

  • 数据链路的地址 -> MAC地址 -> 用来识别同一链路中不同的计算机。
  • 网络层的地址 -> IP地址 -> 用来识别TCP/IP网络中互连的主机和路由器。
  • 传输层 -> 端口号 -> 用来识别同一台计算机中进行通信的不同应用程序(程序地址)。

3次握手4次挥手

主机A                                   主机B
                SYN(请求建立连接)
                SYNbit=1,Seq=x
                ————————————————————>[A发、B收OK]
    
                ACK(针对SYN的确认应答)
                SYN(请求建立连接)
                SYNbit=1,Seq=y
                ACKbit=1,ACKnum=x+1
[A收发、B收发OK]  <————————————————————

                ACK(针对SYN的应答)
                ACKbit=1,ACKnum=y+1
                ————————————————————>[A、B收发都OK]

                [连接建立完成]
                [发送数据]

                FIN(请求切断连接)
                FINbit=1,seq=u
[没有数据发了]    ————————————————————>
                
                ACK(针对FIN的确认应答)
                ACKbit=1,ACKnum=u+1
                <————————————————————[通知A,我收到断开请求,但还有报文没发完]
                
                FIN(请求切断连接)
                FINbit=1,seq=v
                <————————————————————[我也没数据发了]
                
                ACK(针对FIN的确认应答)
                ACKbit=1,ACKnum=v+1
[收到,等2MSL断开]————————————————————>[确认断开]
  • 第一次握手:A发信,B收到。B确认A的发信能力和自己的收信能力没问题。
  • 第二次握手:B发信,A收到。A确认自己的收发信能力没问题,也确认B的发信能力也没问题。
  • 第三次握手:A发信,B收到。B确认了自己的发信能力没问题。(B的收发都没问题)
  • seq:标记数据段的顺序。
  • SYN:建立连接时用于同步序号。SYN=1,ACK=0表示这是一个连接请求报文段,若同意连接响应报文段使用SYN=1,ACK=1
  • SYNFIN段都会利用重传进行可靠传输。

ack值+1作用

  • 表明收到了上一包。

为什么等待时间是2MSL

  • 挥手最后一次,A进入等待,等2MSL(2个报文最大生命周期)。保证B发送的消息及ACK到达。
  • 假设最后一个ACK消失,虽然客户端进程不在,但TCP连接还在,仍然可以重发。