阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux基础教程之TCP协议详解

88次阅读
没有评论

共计 9251 个字符,预计需要花费 24 分钟才能阅读完成。

批处理应用程序

    FTP、TFTP、库存更新

    无需直接人工交互

    带宽很重要,但并非关键性因素

交互式应用程序

    库存查询、数据库更新。

    人机交互。

    因为用户需等待响应,所以响应时间很重要,但并非关键性因素,除非要等待很长时间。

实时应用程序

    VoIP、视频

    人与人的交互

    端到端的延时至关重要

拓扑结构

物理拓扑:

总线拓扑; 所有设备均可接收信号

环状拓扑; 信号绕环传输, 单一故障点

星型拓扑; 通过中心点传输, 单一故障点

扩展星型拓扑; 比星型拓扑的复原能力更强

逻辑拓扑:

双环拓扑; 信号沿相反方向传输, 比单环的复原能力更强

全网状拓扑; 容错能力强, 实施成本高

部分网状拓扑; 在容错能力与成本之间寻求平衡

网络模型分层:七层

1- 4 层通信子网      5- 7 层资源子网

1. 物理层:

二进制传输;为启动,维护以及关闭物理链路定义了电气规范,机械规范,过程规范和功能规范

2. 数据链路层:

访问介质;定义如何格式化数据以便进行传输以及如何控制对网络的访问

支持错误检测

3. 网络层;数据传输

路由数据包

选择传递数据的最佳路径

支持逻辑寻址和路径选择

4. 传输层;传输问题

确保数据传输的可靠性

建立,维护和终止虚拟电路

通过错误检查和恢复

信息流控制来保障可靠性

5. 会话层;主机间通信

建立,管理和终止在应用程序之间的会话

6. 表示层;数据表示

确保接受系统可以读出该数据

格式化数据

构建数据

协商用于应用层的数据传输语法

提供加密

7. 应用层;网络进程访问应用层

为应用程序进程提供网络服务(电子邮件,文件传输和终端仿真)

提供用户身份验证

对等通信

三种通讯模式

1. 单播:两台计算机通过特有的通道进行通信。

2. 广播:多台计算机在一定的范围内通信 (本地子网范围),当某一计算机发送消息,其他所有的计算机都会受到信息。

3. 组播:即发送者和接受者可以实现多种通信方式,这种方式以小组的形式存在,既可以是同一物理网络,也可以是不同的物理网络。这样一来,就能极大地提升通信的速率。

LAN 组成     局域网 Local Area Network

Computers

    PCs 计算机

    Servers 服务器

Interconnections

    NICs 网卡

    Media 媒体

Network devices 网络设备

    Hubs 集线器

    Switches 交换机

    Routers 路由器

Protocols 协议

    Ethernet 以太网

    IP

    ARP

    DHCP

网络线缆和接口

双绞线 Twisted-Pair

线缆 Coaxal

光纤 Fiber-Optic

UTP

线序:T568B 标准        橙白  橙绿白蓝蓝白绿棕白棕

100M 实际用 1 /2(发数据)3/6(收数据)两组线

1000M 实际用 1 /2 3/6 4/5 7/8(都可收发数据)四组线

UTP 直通线 (Straight-Through)

以太网桥

交换式以太网的优势

扩展了网络带宽

分割了网络冲突域,使网络冲突被限制在最小的范围内

交换机作为更加智能的交换设备,能够提供更多用户所要求的功能:优先级、虚拟网、远程检测……

以太网桥的工作原理

以太网桥监听数据帧中源 MAC 地址,学习 MAC,建立 MAC 表 表

对于未知 MAC 地址,网桥将转发到除接收该帧的端口之外的所有端口

    当网桥接到一个数据帧时,如果该帧的目的位于接收端口所在网段上,它就过滤掉该数据帧;如果目的 MAC 地址在位于另外一个端口,网桥就将该帧转发到该端口

    当网桥接到广播帧时候,它立即转发到除接收端口之外的所有其他端口

路由器

为了实现路由, 路由器需要做下列事情:

    分隔广播域

    选择路由表中到达目标最好的路径

    维护和检查路由信息

    连接广域网

路由

路由:把一个数据包从一个设备发送到不同网络里的另一个设备上去。这些工作依靠路由器来完成。路由器只关心网络的状态和决定网络中的最佳路径。路由的实现依靠路由器中的路由表来

VLAN

分隔广播域

安全

灵活管理

VLAN =  广播域 = 络逻辑网络 (Subnet)

分层的网络架构

核心层 Core Layer          企业级应用快速转发

分布层 Distribution Layer    广播域,路由,安全,远程接入,访问层汇聚

访问层 Access Layer        终端接入

TCP/IP 协议栈

Transmission Control Protocol/Internet Protocol

传输控制协议 / 因特网互联协议

TCP/IP 是一个 Protocol Stack,包括 TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP 等许多协议

最早发源于美国国防部(缩写为 DoD)的因特网的前身 ARPA 网项目,1983 年 1 月 1

日,TCP/IP 取代了旧的网络控制协议 NCP,成为今天的互联网和局域网的基石和标准。由互联网工程任务组负责维护。

共定义了四层

和 ISO 参考模型的分层有对应关系

TCP/IP 协议栈和 OSI 模型

TCP/IP 应用层

Application

File transfer 文件传输

FTP FTP 协议 传载大文件

TFTP 轻量级 FTP 传载小文件

Network File System 网络文件系统

E-mail 电子邮件

Simple Mail Transfer Protocol 简单邮件传输协议

Remote login 远程登录

Telnet

rlogin

Network management 网络管理

Simple Network Management Protocol 简单网络管理协议

Name management 名称管理

Domain Name System 域名系统

传输层

Transport

Session multiplexing 多路会话

Segmentation 分段

Flow control (when required) 流控制(必要时)

Connection-oriented(when required) 面向连接(必要时)

Reliability (when required) 可靠的(必要时)

 Reliable 可靠的 Best-Effort 高效的
Connection Type 连接类型 Connection-oriented 面向连接的 Connectionless 无连接
Protocol 协议 TCPUDP
Sequencing 顺序 YesNo
UsesE-mail 电子邮件

File sharing 文件共享

Downloading 下载

Voice streaming 语音流

Video streaming 视频流

TCP 特性

工作在传输层面向连接协议

    全双工协议

    半关闭

    错误检查

    将数据打包成段,排序

    确认机制

    数据恢复,重传

    流量控制,滑动窗口

    拥塞控制,慢启动和拥塞避免算法

TCP 包头

源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用 16 位表示的,可推算计算机的端口个数为 2^16 个

       序列号:表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由 32 位表示,所以每 2^32 个字节,就会出现序列号回绕,再次从 0 开始

       确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号。也就是告诉发送方:我希望你(指发送方)下次发送给我的 TCP 报文段的序列号字段的值是这个

       数据偏移:由于 TCP 首部包含一个长度可变的选项部分,所以需要这么一个值来指定这个 TCP 出报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,即 TCP 报文段的首部长度。该字段的单位是 32 位字,即:4 个字节

URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当 URG= 1 时才有效

ACK:表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当 ACK= 1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1, 带 ACK 标志的 TCP 报文段称为确认报文段

       PSH:提示接收端应用程序应该立即从 TCP 接收缓冲区中读走数据,为接收后续数据腾出空间。如果为 1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在 TCP 接收缓冲区中

       RST:如果收到一个 RST=1 的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带 RST 标志的 TCP 报文段称为复位报文段

       SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才置为 1,带 SYN 标志的 TCP 报文段称为同步报文段

v FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果 FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带 FIN 标志的 TCP 报文段称为结束报文段

窗口大小:表示现在运行对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量

    校验和:提供额外的可靠性

    紧急指针:标记紧急数据在数据字段中的位置。

    选项部分:其最大长度可根据 TCP 首部长度进行推算。TCP 首部长度用 4 位表示,选项部分最长为:(2^4-1)*4-20=40 字节

TCP 协议

传输层通过 port 号,确定应用层协议

Port number:

tcp:传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路

0-65535

udp:User Datagram Protocol,无连接的协议

0-65535

IANA: 互联网数字分配机构(负责域名,数字资源,协议分配)

0-1023:系统端口或特权端口 (仅管理员可用),众所周知,永久的分配给固定的系统应用使用,22/tcp(ssh), 80/tcp(http), 443/tcp(https)

1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用,1433/tcp(SqlServer,1521/tcp(oracle),3306/tcp(mysql),11211/tcp/udp (memcached)

49152-65535::动态端口或私有端口,客户端程序随机使用的端口其范围的定义:/proc/sys/net/ipv4/ip_local_port_range

TCP 三次握手

第一次握手:建立连接。客户端发送连接请求报文段,将 SYN 位置为 1,Sequence Number 为 x;然后,客户端进入 SYN_SEND 状态,等待服务器的确认

第二次握手:服务器收到 SYN 报文段。服务器收到客户端的 SYN 报文段,需要对这个 SYN 报文段进行确认,设置 Acknowledgment Number 为 x +1(Sequence Number+1);同时,自己自己还要发送 SYN 请求信息,将 SYN 位置为 1,Sequence Number 为 y;服务器端将上述所有信息放到一个报文段(即 SYN+ACK 报文段)中,一并发送给客户端,此时服务器进入 SYN_RECV 状态

第三次握手:客户端收到服务器的 SYN+ACK 报文段。然后将 Acknowledgment Number 设置为 y +1,向服务器发送 ACK 报文段,这个报文段发送完毕以后,客户端和服务器端都进入 ESTABLISHED 状态,完成 TCP 三次握手

为什么要三次握手

已失效的连接请求报文段”的产生在这样一种情况下:client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。

防止服务器端一直等待而浪费资源

TCP 四次挥手

第一次分手:主机 1(可以使客户端,也可以是服务器端),设置 Sequence Number 和 Acknowledgment Number,向主机 2 发送一个 FIN 报文段;此时,主机 1 进入 FIN_WAIT_1 状态;这表示主机 1 没有数据要发送给主机 2 了

第二次分手:主机 2 收到了主机 1 发送的 FIN 报文段,向主机 1 回一个 ACK 报文段,Acknowledgment Number 为 Sequence Number 加 1;主机 1 进入 FIN_WAIT_2 状态;主机 2 告诉主机 1,我“同意”你的关闭请求

第三次分手:主机 2 向主机 1 发送 FIN 报文段,请求关闭连接,同时主机 2 进入 LAST_ACK 状态

第四次分手:主机 1 收到主机 2 发送的 FIN 报文段,向主机 2 发送 ACK 报文段,然后主机 1 进入 TIME_WAIT 状态;主机 2 收到主机 1 的 ACK 报文段以后,就关闭连接;此时,主机 1 等待 2MSL 后依然没有收到回复,则证明 Server 端已正常关闭,那好,主机 1 也可以关闭连接了

TCP 协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP 是全双工模式,这就意味着,当主机 1 发出 FIN 报文段时,只是表示主机 1 已经没有数据要发送了,主机 1 告诉主机 2,它的数据已经全部发送完毕了;但是,这个时候主机 1 还是可以接受来自主机 2 的数据;当主机 2 返回 ACK 报文段时,表示它已经知道主机 1 没有数据发送了,但是主机 2 还是可以发送数据到主机 1 的;当主机 2 也发送了 FIN 报文段时,这个时候就表示主机 2 也没有数据要发送了,就会告诉主机 1,我也没有数据要发送了,之后彼此就会愉快的中断这次 TCP 连接。

FIN_WAIT_1: 这个状态要好好解释一下,其实 FIN_WAIT_1 和 FIN_WAIT_2 状态的真正含义都是表示等待对方的 FIN 报文。而这两种状态的区别是:FIN_WAIT_1 状态实际上是当 SOCKET 在 ESTABLISHED 状态时,它想主动关闭连接,向对方发送了 FIN 报文,此时该 SOCKET 即进入到 FIN_WAIT_1 状态。而当对方回应 ACK 报文后,则进入到 FIN_WAIT_2 状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应 ACK 报文,所以 FIN_WAIT_1 状态一般是比较难见到的,而 FIN_WAIT_2 状态还有时常常可以用 netstat 看到。(主动方)FIN_WAIT_2:上面已经详细解释了这种状态,实际上 FIN_WAIT_2 状态下的 SOCKET,表示半连接,也即有一方要求 close 连接,但另外还告诉对方,我暂时还有点数据需要传送给你 (ACK 信息),稍后再关闭连接。(主动方)

CLOSE_WAIT:这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方 close 一个 SOCKET 后发送 FIN 报文给自己,你系统毫无疑问地会回应一个 ACK 报文给对方,此时则进入到 CLOSE_WAIT 状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close 这个 SOCKET,发送 FIN 报文给对方,也即关闭连接。所以你在 CLOSE_WAIT 状态下,需要完成的事情是等待你去关闭连接。(被动方)

LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送 FIN 报文后,最后等待对方的 ACK 报文。当收到 ACK 报文后,也即可以进入到 CLOSED 可用状态了。(被动方)

TIME_WAIT: 表示收到了对方的 FIN 报文,并发送出了 ACK 报文,就等 2MSL 后即可回到 CLOSED 可用状态了。如果 FINWAIT1 状态下,收到了对方同时带 FIN 标志和 ACK 标志的报文时,可以直接进入到 TIME_WAIT 状态,而无须经过 FIN_WAIT_2 状态。(主动方)

CLOSED: 表示连接中断。

例:

    1.OSI 模型中物理层,数据链路层,网络层,传输层中的数据传输单位分别是什么?其他三个层的名称是什么?

    答: 物理层单位为比特 bit,数据链路层单位为帧,网络层单位为包,传输层单位为段,其他三个层分别是会话层,表示层,应用层。

    2. 简述为什么说 TCP 是可靠连接而 UDP 是不可靠连接?

    答:TCP 是面向连接的协议 (三次握手,四次挥手),全双工,半关闭,将数据打成段,排序,错误检查,确认机制,数据恢复,重传,流量控制,滑动窗口,拥塞控制,慢启动和拥塞避免算法。

TCP 超时重传

异常网络状况下(开始出现超时或丢包),TCP 控制数据传输以保证其承诺的可靠服务

TCP 服务必须能够重传超时时间内未收到确认的 TCP 报文段。为此,TCP 模块为每个 TCP 报文段都维护一个重传定时器,该定时器在 TCP 报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP 模块将重传 TCP 报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是 TCP 的重传策略

与 TCP 超时重传相关的两个内核参数:

/proc/sys/net/ipv4/tcp_retries1,指定在底层 IP 接管之前 TCP 最少执行的重传次数,默认值是 3

    /proc/sys/net/ipv4/tcp_retries2,指定连接放弃前 TCP 最多可以执行的重传次数,默认值 15(一般对应 13 ~30min)

拥塞控制

TCP 为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。即所谓的拥塞控制

TCP 拥塞控制的标准文档是 RFC 5681,其中详细介绍了拥塞控制的四个部分:慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fast recovery)。拥塞控制算法在 Linux 下有多种实现,比如 reno 算法、vegas 算法和 cubic 算法等。它们或者部分或者全部实现了上述四个部分

当前所使用的拥塞控制算法

/proc/sys/net/ipv4/tcp_congestion_control

映射第四层到应用程序

UDP 特性

工作在传输层

提供不可靠的网络访问

非面向连接协议

有限的错误检查

传输性能高

ARP 表

[root@centos7 ~]#ip neigh 192.168.74.1 dev eth0 lladdr 00:50:56:c0:00:01 REACHABLE 192.168.74.254 dev eth0 lladdr 00:50:56:e3:29:de STALE 192.168.199.1 dev eth1 lladdr d4:ee:07:52:3a:46 STALE 192.168.199.207 dev eth1 lladdr ac:c1:ee:7b:a3:5b STALE [root@centos7 ~]#arp -n Address HWtype HWaddress Flags Mask Iface 192.168.74.1 ether 00:50:56:c0:00:01 C eth0 192.168.74.254 ether 00:50:56:e3:29:de C eth0 192.168.199.1 ether d4:ee:07:52:3a:46 C eth1 192.168.199.207 ether ac:c1:ee:7b:a3:5b C eth1

Internet 层

Internet Protocol (IP) 因特网协议(IP)

Internet Control Message 因特网控制消息

Protocol (ICMP) 协议(ICMP)

Address Resolution 地址解析

Protocol (ARP) 协议(ARP)

Reverse Address 反向地址

Resolution Protocol (RARP) 解析协议(RARP)

Internet 协议特征    

    运行于 OSI 网络层

    面向无连接的协议

    独立处理数据包

    分层编址

    尽力而为传输

    无数据恢复功能

IP PDU 报头

版本: 占 4 位, 指 IP 协议的版本目前的 IP 协议版本号为 4

首部长度: 占 4 位, 可表示的最大数值是 15 个单位,一个单位为 4 字节,因此 IP 的首部长度的最大值是 60 字节

区分服务: 占 8 位, 用来获得更好的服务, 在旧标准中叫做服务类型, 但实际上一直未被使用过. 后改名为区分服务. 只有在使用区分服务 (DiffServ) 时, 这个字段才起作用. 一般的情况下都不使用

总长度: 占 16 位, 指首部和数据之和的长度, 单位为字节, 因此数据报为的最大长度为 65535  字节. 总长度必须不超过最大传送单元 MTU

标识: 占 16 位, 它是一个计数器, 通常,每发送一个报文,改值会加 1,也用于数据包分片,在同一个包的若干分片中,该值是相同的

标志 (flag): 占 3 位, 目前只有前两位有意义

MF:标志字段的最低位是 MF(More Fragment),MF= 1 表示后面还有分片。MF= 0 表示最后一个分片

DF:标志字段中间的一位是 DF(Don’t Fragment) 当,只有当 DF= 0 时才允许分片片偏移: 占 12 位, 指较长的分组在分片后某片在原分组中的相对位置. 片偏移以 8 个字节为偏移单位

       生存时间: 占 8 位, 记为 TTL (Time To Live) 数据报在网络中可通过的路由器数的最大值,TTL 字段是由发送端初始设置一个 8 bit 字段. 推荐的初始值由分配数字 RFC 指定, 当前值为 64. 发送 ICMP 把回显应答时经常把 TTL 值设为最大值 255

       协议: 占 8 位, 指出此数据报携带的数据使用何种协议以便目的主机的 IP 层将数据部分上交给哪个处理过程, 1 表示为 ICMP 协议, 2 表示为 IGMP 协议, 6 表示为 TCP 协议, 17 表示为 UDP 协议

       首部检验和: 占 16 位, 只检验数据报的首部不检验数据部分. 这里不采用 CRC 检验码而采用简单的计算方法

       源地址和目的地址: 都各占 4 字节, 分别记录源地址和目的地址

IP PDU 报头示例

片偏移以 8 个字节为偏移单位

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-12-03发表,共计9251字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中