学习计算机网络(一)

285 阅读29分钟

为什么要学习网络协议?

随着物联网、音视频、直播等领域的发展,企业提高对开发人员网络基本功的要求,经常问网络协议的面试题。

  • TCP和UDP的区别?
  • 说一下它们的报文格式?
  • TCP的流量控制和和拥塞控制?TCP如何实现可靠性传输?
  • 为什么连接是3次握手,关闭是4次挥手?
  • 7层模型与4层模型的区别?每一层的作用是什么?
  • 交换机与路由器的区别?
  • ......

主要学习协议: HTTP、HTTPS、SMTP、MQTT、RTMP等。

思考:数据是如何从一个设备传递到另一个设备的?

这一切都是由网络协议来规定的。没有网络协议,就没有今天的互联网。

网络常用概念:

什么是互联网,因特网?

两个网段互联了,就叫互联网(internet)。将全世界所有的计算机都连接在一起,叫做Internet。日常生活中说的:你的电脑上不了网。其实就是指:你的电脑没有连接到因特网

什么是ISP?

ISP,Internet Service Provider,Internet服务提供商,比如移动、电信、网通、铁通等。我们平时拉的宽带都是通过ISP连接到Internet的

网络的分类

按照网络的范围进行分类,可以分为:局域网、城域网、广域网等

  • 局域网(Local Area Network, LAN) 一般是范围在几百米到十几公里内的计算机所构成的计算机网络 常用于公司、家庭、学校、医院、机关、一幢大楼等 局域网中使用最广泛的网络技术叫:以太网(Ethernet) 在电脑、手机上经常见到的一个英文 WLAN(Wireless LAN),意思是无线局域网
  • 城域网(Metropolitan Area Network,MAN) 一般范围是数十公里到数百公里,可以覆盖一个城市
  • 广域网(Wide Area Network,WAN) 一般范围是几百公里到几千公里,可以覆盖一个国家。通常都需要租用 的线路。

常见的几种接口

FastEthernet 快速以太网接口(100M) GigabitEthernet 千兆以太网接口 Serial 串行接口

上网方式:

  1. ** 电话线上线**

这就是平时说的:ADSL电话拨号上网(Asymmetric ) 非对称数字用户线路,提供上、下行不对称的传输带宽 猫(Modem),调制解调器,进行数字信号和模拟信号的转换

  1. 光纤上网

光猫(Optical Modem ),光调制解调器,进行数字信号和光信号的转换

  1. 网线上网

  2. 家用路由器

image.png

什么是协议?

类比租房协议

image.png

计算机之间如何通信

  1. 需要得知对方的IP地址
    • 最终是根据 地址(网卡地址),输送数据到网卡,被网卡接收
    • 如果网卡发现数据的目标 地址是自己,就会将数据传递给上一层进行处理
    • 如果网卡发现数据的目标 地址不是自己,就会将数据丢弃,不会传递给上一层进行处理

计算机之间的连接方式:

同轴电缆: image.png 特点:

  1. 半双工通信
  2. 容易冲突
  3. 不安全
  4. 中间断了,整个都瘫了

集线器(HUB): image.png 特点:

  • 半双工通信
  • 容易冲突
  • 不安全
  • 跟同轴电缆一样:没有智商

网桥(bridge) image.png

特点: 能够通过自学习得知每个接口那侧的MAC地址 从而起到隔绝冲突域的作用

交换机(switch) image.png

特点:

  • 相当于接口更多的网桥
  • 全双工通信
  • 比集线器安全

思考:全球所有的设备都用交换机连接会是什么情况?

路由器(router): image.png

特点: 网线直连、同轴电缆、集线器、网桥、交换机,连接的设备必须在同一网段,连接的设备处在同一广播域。 路由器,可以在不同网段之间转发数据,隔绝广播域。

MAC地址

mac地址又称网卡地址,是用有一个6字节(48bit)的mac地址表示的;

特点:

  1. 全球唯一,固化在了网卡的ROM中,由IEEE802标准规定。
  2. 前三个字节,(OUI)组织标识符,由IEEE的注册管理机构分配给厂商的。
  3. 后三个字节,表示网络接口标识符,有厂商自行分配。

image.png

OUI查询连接standards-oui.ieee.org/oui/oui.txt mac.bmcx.com/

mac地址的表示方式

windows: 40-55-82-0A-8C-6D Linux、Android、Mac、iOS: 40:55:82:0A:8C:6D 当48位全为1时,代表广播地址 FF-FF-FF-FF-FF-FF

如何获取mac地址?

当不知道对方主机的MAC地址时,可以通过发送ARP广播获取对方的MAC地址: 1. 获取成功后,会缓存IP地址、MAC地址的映射信息,俗称:ARP缓存 2. 通过ARP广播获取的MAC地址,属于动态(dynamic)缓存

  1. 存储时间比较短(默认是2分钟),过期了就自动删除

相关命令 arp -a [主机地址]:查询ARP缓存 arp -d [主机地址]:删除ARP缓存 arp -s 主机地址 MAC地址:增加一条缓存信息(这是静态缓存,存储时间较久,不同系统的存储时间不同)

什么是ARP

ARP(Address Resolution Protocal),译为:地址解析协议 通过IP地址获取MAC地址

RARP(Reverse Address Resolution Protocaol),译为:逆地址解析协议

  • 使用与ARP相同的报头结构
  • 作用与ARP相反,用于将MAC地址转换为IP地址
  • 后来被BOOTP、DHCP所取代

什么是ICMP

ICMP[1]依靠IP来完成它的任务,它是IP的主要部分。 它与传输协议(如TCPUDP)显著不同:它一般不用于在两点间传输数据。它通常不由网络程序直接使用,除了pingtraceroute这两个特别的例子。 IPv4中的ICMP被称作ICMPv4,IPv6中的ICMP则被称作ICMPv6

什么是IP地址

IP地址(Internet Protocol Address):互联网上的每一个主机都有一个IP地址。最初是IPv4版本,32bit(4字节),2019年11月25日,全球的IP地址已经用完。后面推出了IPv6版本,128bit(16字节)

案例:192.168.1.10

ip地址的组成

IP地址由2部分组成:网络标识(网络ID)、主机标识(主机ID),通过子网掩码(subnet mask)可以得知网络ID 、主机ID。

主机所在的网段 = 子网掩码 & IP地址

计算机和其他计算机通信前,会先判断目标主机和自己是否在同一网段

  1. 同一网段:不需要由路由器进行转发
  2. 不同网段:交由路由器进行转发

IP网址的分类

地址类型特征介绍
A类地址第一位为0,注意是位
  1. 第1字节为网络地址,其它3个字节为主机地址
  2. 地址范围:1.0.0.1—126.255.255.254
  3. 10.X.X.X是私有地址,范围从10.0.0.0-10.255.255.255
  4. 127.X.X.X是保留地址,用做环回测试。
  5. 容纳最大主机数:2的24次方 – 2 = 16777214 | | B类地址 | 前两位为10,注意是位 |
  6. ** 第1字节和第2字节为网络地址,后2个字节为主机地址**
  7. 地址范围:128.0.0.1—191.255.255.254
  8. 私有地址范围:172.16.0.0—172.31.255.255
  9. 保留地址:169.254.X.X
  10. 容纳最大主机数:2的16次方 – 2 = 65534 | | C类地址 | 前三位为110,注意是位 |
  11. 前三个字节为网络地址,最后字节为主机地址
  12. 地址范围:192.0.0.1—223.255.255.254
  13. 私有地址:192.168.X.X,范围从192.168.0.0-192.168.255.255
  14. 容纳最大主机数:2的8次方 – 2 = 254 | | D类地址 | 前四位为1110,注意是位 | 1、不分网络地址和主机地址。 2、地址范围:224.0.0.1—239.255.255.254 | | E类地址 | 前五位为11110,注意是位 | 1、不分网络地址和主机地址 2、地址范围:240.0.0.1—255.255.255.254 |

注意:

  1. 只有A\B\C类地址才能分配给主机
  2. 主机ID为全0,表示主机所在的网段
  3. 主机ID为全1,表示主机所在网段的全部主机(广播)
  4. 可以尝试用ping给某个网段的全部主机发数据

子网掩码的CIDR表示方法

CIDR(Classless Inter-Domain Routing):无类别域间路由 子网掩码的CIDR表示方法 192.168.1.100/24,代表子网掩码有24个1,也就是255.255.255.0 123.210.100.200/16,代表子网掩码有16个1,也就是255.255.0.0

**计算工具: **https://www.sojson.com/convert/subnetmask.html

为什么要进行子网划分?

如果需要让200台主机在同一个网段内,可以分配一个C类网段,比如192.168.1.0/24 共254个可用IP地址:192.168.1.1~192.168.1.254 多出54个空闲的IP地址,这种情况并不算浪费资源

如果需要让500台主机在同一个网段内,那就分配一个B类网段,比如191.100.0.0/16 共65534个可用IP地址:191.100.0.1~191.100.255.254 多出65034个空闲的IP地址,这种情况属于极大的浪费资源

如何尽量避免浪费IP地址资源?

子网划分方式

  • 等长子网划分:将一个网段等分成多个子网,每个子网的可用IP地址数量是一样的

image.png

  • 变长子网划分:每个子网的可用IP地址数量可以是不一样的
  • image.png

什么是超网

超网:跟子网反过来,它是将多个连续的网段合并成一个更大的网段

** 需求:原本有200台计算机使用192.168.0.0/24网段,现在希望增加200台设备到同一个网段** 200台在192.168.0.0/24网段,200台在192.168.1.0/24网段 合并192.168.0.0/24、192.168.1.0/24为一个网段:192.168.0.0/23(子网掩码往左移动1位)

image.png 合并网段的规律

  • 如果第一个网段的网络号能被n整除,那么由它开始连续的n个网段,能通过左移k位子网掩码进行合并
  • 第一个网段的网络号以二进制0结尾,那么由它开始连续的2个网段,能通过左移1位子网掩码进行合并
  • 第一个网段的网络号以二进制00结尾,那么由它开始连续的4个网段,能通过左移2位子网掩码进行合并
  • 第一个网段的网络号以二进制000结尾,那么由它开始连续的8个网段,能通过左移3位子网掩码进行合并

判断一个网段是子网还是超网

首先 看看该网段的类型,是A类网络、B类网络、C类网络? 默认情况下,A类子网掩码的位数是8,B类子网掩码的位数是16,C类子网掩码的位数是24 然后 如果该网段的子网掩码位数比默认子网掩码多,就是子网 如果该网段的子网掩码位数比默认子网掩码少,则是超网 比如 25.100.0.0/16是一个A类子网 200.100.0.0/16是一个C类超网

NAT技术 (Network Address Translation)

私网IP访问Internet需要进行NAT转换为公网IP。(这一步可以由路由器来完成) NAT的特点 可以节约公网IP资源 会隐藏内部真实IP NAT的分类 1. 静态转换 手动配置NAT映射表,一对一转换 2. 动态转换 定义外部地址池,动态随机转换,一对一转换 3. PAT(Port Address Translation)

  1. 多对一转换,最大程度节约公网 资源
  2. 采用端口多路复用方式,通过端口号标识不同的数据流
  3. 前应用最广泛的NAT实现方式
案例:
公网pi 200.0.0.10
私网ip 192.168.1.10;

192.168.1.10:23123 -> 200.0.0.10:23123
192.168.1.10:5435 -> 200.0.0.10:5435
192.168.1.10:7676 -> 200.0.0.10:7676

// 多路复用的方式

网络分层与常见协议

image.png

物理层

物理层主要指的是硬件(网线,交换机,路由器等)。定义了接口标准,线缆标准,参数速率,传输方式等;

数据通信模型

image.png

模拟信号

特点:1. 连续的信号,适合长距离阐述。2. 抗干扰能力差,受到干扰时波形变形很难纠正。

数字信号

特点:1.离散的信号,不适合长距离传输。2. 抗干扰能力强,受到干扰时波形失真可以修复。

信道(channel)

信道:信息传输的通道,一条传输介质上(比如网线)上可以有多条信道

  • 单工通信 信号只能往一个方向传输,任何时候都不能改变信号的传输方向 比如无线电广播、有线电视广播
  • 半双工通信 信号可以双向传输,但必须是交替进行,同一时间只能往一个方向传输 比如对讲机
  • 全双工通信 信号可以同时双向传输 比如手机(打电话,听说同时进行)

数据链路层(Data Link)

链路:从1个节点到相邻节点的一段物理线路(有线或无线),中间没有其他交换节点。 数据链路:在一条链路上传输数据时,需要有对应的通信协议来控制数据的传输。

常见链路层协议:

  1. 广播信道:CSMA/CD协议(比如同轴电缆、集线器等组成的网络)
  2. PPP协议(比如2个路由器之间的信道)

数据链路层的3个基本问题

  1. 封装成帧

image.png 帧(Frame)的数据部分就是网络层传递下来的数据包(IP数据包,Packet) 最大传输单元MTU(Maximum Transfer Unit)

  1. 每一种数据链路层协议都规定了所能够传送的帧的数据长度上限
  2. 以太网的MTU为1500个字节
  3. 透明传输

image.png 特点:

  • 使用SOH(Start Of Header)作为帧开始符
  • 使用EOT(End Of Transmission)作为帧结束符
  • 如果数据包包含了SOH或者EOT,需要进行转义

image.png

  1. 差错检验

image.png FCS是根据数据部分 + 首部计算得出的

CSMA/CD协议

CSMA/CD(Carrier Sense Multiple Access with Collision Detectio,载波侦听多路访问/冲突检测

使用了CSMA/CD的网络可以称为是以太网(Ethernet),它传输的是以太网帧。以太网帧的格式有:Ethernet V2标准、IEEE的802.3标准。使用最多的是:Ethernet V2标准。

用交换机组建的网络,已经支持全双工通信,不需要再使用CSMA/CD,但它传输的帧依然是以太网帧。所以,用交换机组建的网络,依然可以叫做以太网。

解释:以集线器为例,(半双工通信)

  1. 载波监听,是可以监听信道是否有消息。
  2. 多路访问,每个机器都可以进行通信。
  3. 为了能够检测正在发送的帧是否产生了冲突,以太网的帧至少要64字节。

Ethernet V2标准。

image.png

首部:目标MAC +源MAC + 网络类型 ◼ 以太网帧:首部 + 数据 + FCS ◼ 数据的长度至少是:64 – 6 – 6 – 2 – 4 = 46字节

数据不够的情况: 当数据部分的长度小于46字节时 数据链路层会在数据的后面加入一些字节填充 接收端会将添加的字节去掉

image.png

长度总结

  • 以太网帧的数据长度:46~1500字节
  • 以太网帧的长度:64~1518字节(目标MAC +源MAC + 网络类型 + 数据 + FCS)

注意: ◼ 网卡接收到一个帧,首先会进行差错校验,如果校验通过则接收,否则丢弃 ◼ Wireshark抓到的帧没有FCS ,因为它抓到的是差错校验通过的帧(帧尾的FCS会被硬件去掉) Wireshark抓不到差错校验失败的帧

PPP协议(Point to Point Protacol)

image.png 特点: Address字段:图中的值是0xFF,形同虚设,点到点信道不需要源MAC、目标MAC地址 ◼ Control字段:图中的值是0x03,目前没有什么作用 ◼ Protocol字段:内部用到的协议类型 ◼ 帧开始符、帧结束符:0x7E

网络层(Network)

网络层数据包(IP数据包,Packet)由首部、数据2部分组成。数据:很多时候是由传输层传递下来的数据段(Segment) image.png 版本(Version) 占4位 0b0100:IPv4 0b0110:IPv6 首部长度(Header Length) 占4位,二进制乘以4才是最终长度 0b0101:20(最小值) 0b1111:60(最大值) 区分服务(Differentiated Services Field) 占8位 可以用于提高网络的服务质量(QoS,Quality of Service) 总长度(Total Length) 占16位 首部 + 数据的长度之和,最大值是65535 image.png

由于帧的数据不能超过1500字节,所以过大的IP数据包,需要分成片(fragments)传输给数据链路层。每一片都有自己的网络层首部(IP首部)

标识(Identification) 占16位 数据包的ID,当数据包过大进行分片时,同一个数据包的所有片的标识都是一样的 有一个计数器专门管理数据包的ID,每发出一个数据包,ID就加1

标志(Flags) 占3位 第1位(Reserved Bit):保留 第2位(Don't Fragment):1代表不允许分片,0代表允许分片 第3位(More Fragments):1代表不是最后一片,0代表是最后一片

如何分片

image.png特点:片偏移(Fragment Offset) 占13位 片偏移乘以8:字节偏移 每一片的长度一定是8的整数倍 image.png 协议(Protocol) 占8位 表明所封装的数据是使用了什么协议

image.png 首部校验和(Header Checksum) 用于检查首部是否有错误

传输层(transport)

传输层有2个协议 TCP(Transmission Control Protocol),传输控制协议 UDP(User Datagram Protocol),用户数据报协议 image.png

UDP

UDP是无连接的,减少了建立和释放连接的开销 UDP尽最大能力交付,不保证可靠交付 因此不需要维护一些复杂的参数,首部只有8个字节(TCP的首部至少20个字节) image.png 特点: UDP长度(Length) 占16位,首部的长度 + 数据的长度

UDP检验和(Chgecksum)

检验和的计算内容:伪首部 + 首部 + 数据 伪首部:仅在计算检验和时起作用,并不会传递给网络层 image.png

常见占用默认端口

image.png 特点: ◼ UDP首部中端口是占用2字节 可以推测出端口号的取值范围是:0~65535 ◼ 客户端的源端口是临时开启的随机端口 ◼ 防火墙可以设置开启\关闭某些端口来提高安全性

常用命令行 netstat –an:查看被占用的端口 netstat –anb:查看被占用的端口、占用端口的应用程序

TCP协议

数据格式

image.png 数据偏移 占4位,取值范围是0x01010x1111 乘以4:首部长度(Header Length) 首部长度是2060字节 保留 占6位,目前全为0

注意事项:

  1. 有些资料中,TCP首部的保留(Reserved)字段占3位,标志(Flags)字段占9位,Wireshark中也是如此
  2. UDP的首部中有个16位的字段记录了整个UDP报文段的长度(首部+数据)
    1. 但是,TCP的首部中仅仅有个4位的字段记录了TCP报文段的首部长度,并没有字段记录TCP报文段的数据长度
    2. UDP首部中占16位的长度字段是冗余的,纯粹是为了保证首部是32bit对齐,TCP\UDP的数据长度,完全可以由IP数据包的首部推测出来
    3. 传输层的数据长度 = 网络层的总长度 – 网络层的首部长度 – 传输层的首部长度

TCP检验和

跟UDP一样,TCP检验和的计算内容:伪首部 + 首部 + 数据 伪首部:占用12字节,仅在计算检验和时起作用,并不会传递给网络层 image.png

TCP 标志位(FlagS)

URG(Urgent) 当URG=1时,紧急指针字段才有效。表明当前报文段中有紧急数据,应优先尽快传送 ACK(Acknowledgment) 当ACK=1时,确认号字段才有效 PSH(Push) RST(Reset) 当RST=1时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接 SYN(Synchronization) 当SYN=1、ACK=0时,表明这是一个建立连接的请求 若对方同意建立连接,则回复SYN=1、ACK=1 FIN(Finish) 当FIN=1时,表明数据已经发送完毕,要求释放连接

序号,确认号,窗口

序号(Sequence Number) 占4字节 首先,在传输过程的每一个字节都会有一个编号 在建立连接后,序号代表:这一次传给对方的TCP数据部分的第一个字节的编号 确认号(Acknowledgment Number) 占4字节 在建立连接后,确认号代表:期望对方下一次传过来的TCP数据部分的第一个字节的编号 窗口(Window) 占2字节 这个字段有流量控制功能,用以告知对方下一次允许发送的数据大小(字节为单位)

TCP的几个要点

  1. 可靠传输
  2. 流量控制
  3. 拥塞控制

TCP可靠传输-停止等待ARQ协议

** ARQ(Automatic Repeat–reQuest),自动重传请求** image.png image.png

问题:若有个包重传了N次还是失败,会一直持续重传到成功为止么?

这个取决于系统的设置,比如有些系统,重传5次还未成功就会发送reset报文(RST)断开TCP连接

TCP可靠传输-连续APQ协议+滑动窗口

image.png 问题: 但发送方只发了2个包 接收方如何确定后面还有没有2个包? 等待一定时间后没有第3个包 就会返回确认收到2个包给发送方

TCP可靠传输-SACK(选择性确认)

在TCP通信过程中,如果发送序列中间某个数据包丢失(比如1、2、3、4、5中的3丢失了) TCP会通过重传最后确认的分组后续的分组(最后确认的是2,会重传3、4、5) 这样原先已经正确传输的分组也可能重复发送(比如4、5),降低了TCP性能 为改善上述情况,发展出了SACK(Selective acknowledgment,选择性确认)技术 告诉发送方哪些数据丢失,哪些数据已经提前收到 使TCP只重新发送丢失的包(比如3),不用发送后续所有的分组(比如4、5) image.png 问题:为什么选择在传输层就将数据“大卸八块”分成多个段,而不是等到网络层再分片传递给数据链路层? 因为可以提高重传的性能 需要明确的是:可靠传输是在传输层进行控制的 如果在传输层不分段,一旦出现数据丢失,整个传输层的数据都得重传 如果在传输层分了段,一旦出现数据丢失,只需要重传丢失的那些段即可

TCP-流量控制

如果接收方的缓存区满了,发送方还在疯狂着发送数据 接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源 所以要进行流量控制 什么是流量控制? 让发送方的发送速率不要太快,让接收方来得及接收处理 原理 通过确认报文中窗口字段来控制发送方的发送速率 发送方的发送窗口大小不能超过接收方给出窗口大小 当发送方收到接收窗口的大小为0时,发送方就会停止发送数据

问题:有一种特殊情况 一开始,接收方给发送方发送了0窗口的报文段 后面,接收方又有了一些存储空间,给发送方发送的非0窗口的报文段丢失了 发送方的发送窗口一直为零,双方陷入僵局 解决方案 当发送方收到0窗口通知时,这时发送方停止发送报文 并且同时开启一个定时器,隔一段时间就发个测试报文去询问接收方最新的窗口大小 如果接收的窗口大小还是为0,则发送方再次刷新启动定时器

TCP-拥塞控制

拥塞控制 防止过多的数据注入到网络中 避免网络中的路由器或链路过载 拥塞控制是一个全局性的过程 涉及到所有的主机、路由器 以及与降低网络传输性能有关的所有因素 是大家共同努力的结果 比而言,流量控制是点对点通信的控制 image.png

如何解决?

  1. 慢开始(slow start,慢启动)
  2. 拥塞避免(congestion avoidance)
  3. 快速重传(fast retransmit)
  4. 快速恢复(fast recovery)

几个缩写 MSS(Maximum Segment Size):每个段最大的数据部分大小 在建立连接时确定 cwnd(congestion window):拥塞窗口 rwnd(receive window):接收窗口 swnd(send window):发送窗口 swnd = min(cwnd, rwnd)

慢开始

image.png cwnd的初始值比较小,然后随着数据包被接收方确认(收到一个ACK) cwnd就成倍增长(指数级)

拥塞避免

image.png ssthresh(slow start threshold):慢开始阈值,cwnd达到阈值后,以线性方式增加 拥塞避免(加法增大):拥塞窗口缓慢增大,以防止网络过早出现拥塞 乘法减小:只要网络出现拥塞,把ssthresh减为拥塞峰值的一半,同时执行慢开始算法(cwnd又恢复到初始值) 当网络出现频繁拥塞时,ssthresh值就下降的很快

快重传

接收方 每收到一个失序的分组后就立即发出重复确认 使发送方及时知道有分组没有到达 而不要等待自己发送数据时才进行确认 发送方 只要连续收到三个重复确认(总共4个相同的确认),就应当立即重传对方尚未收到的报文段 而不必继续等待重传计时器到期后再重传 image.png

快恢复

image.png

当发送方连续收到三个重复确认,说明网络出现拥塞 就执行“乘法减小”算法,把ssthresh减为拥塞峰值的一半 与慢开始不同之处是现在不执行慢开始算法,即cwnd现在不恢复到初始值 而是把cwnd值设置为新的ssthresh值(减小后的值) 然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大

发送窗口的最大值 发送窗口的最大值:swnd = min(cwnd, rwnd) 当rwnd < cwnd时,是接收方的接收能力限制发送窗口的最大值 当cwnd < rwnd时,则是网络的拥塞限制发送窗口的最大值

序号,确认号

紫色客户端发的,蓝色服务端回的

image.png image.png image.png image.png

tcp的三次握手

image.png

CLOSED:client处于关闭状态 LISTEN:server处于监听状态,等待client连接 SYN-RCVD:表示server接受到了SYN报文,当收到client的ACK报文后,它会进入到ESTABLISHED状态 SYN-SENT:表示client已发送SYN报文,等待server的第2次握手 ESTABLISHED:表示连接已经建立

其中我们可以发现,首先是三次握手:

第一次SYN: 我们告知服务端,我们的接收窗口(Win)为65535Bytes(64K),最大报文段大小(MSS)为1460Bytes,窗口缩放因子(WS)为256 第二次SYN,ACK: 服务端告知我们,服务端的接收窗口(Win)为14480Bytes,最大报文段大小(MSS)为1456Bytes,窗口缩放因子(WS)为256 第三次ACK: 我们告知服务器,由于双方都有相同的窗口缩放因子256,因此我们的接收窗口根据当前处理能力修改为87808Bytes(343*256) 之后服务端根据我们的接收窗口大小,以及服务端的拥塞窗口大小决定其发送窗口大小,并根据协定的MSS一次发送多个报文段给我们TCP的接收窗口缓存,后面我们的TCP根据处理能力不断调整接收窗口大小持续接收数据,也就是说这块虽然我们应用层没有主动的不断读取输入流,但是TCP的接收窗口已经在不断缓存数据了。

前两次握手的特点:

SYN都设置为1 数据部分的长度都为0 TCP头部的长度一般是32字节 固定头部:20字节 选项部分:12字节 双方会交换确认一些信息 比如MSS、是否支持SACK、Window scale(窗口缩放系数)等 这些数据都放在了TCP头部的选项部分中(12字节)

为什么建立连接的时候,要进行3次握手?2次不行么?

主要目的:防止server端一直等待,浪费资源 如果建立连接只需要2次握手,可能会出现的情况 假设client发出的第一个连接请求报文段,因为网络延迟,在连接释放以后的某个时间才到达server 本来这是一个早已失效的连接请求,但server收到此失效的请求后,误认为是client再次发出的一个新的连接请求 于是server就向client发出确认报文段,同意建立连接 如果不采用“3次握手”,那么只要server发出确认,新的连接就建立了 由于现在client并没有真正想连接服务器的意愿,因此不会理睬server的确认,也不会向server发送数据 但server却以为新的连接已经建立,并一直等待client发来数据,这样,server的很多资源就白白浪费掉了 采用“三次握手”的办法可以防止上述现象发生 例如上述情况,client没有向server的确认发出确认,server由于收不到确认,就知道client并没有要求建立连接

第3次握手失败了,会怎么处理?

此时server的状态为SYN-RCVD,若等不到client的ACK,server会重新发送SYN+ACK包 如果server多次重发SYN+ACK都等不到client的ACK,就会发送RST包,强制关闭连接

4次挥手

image.png

状态 FIN-WAIT-1:表示想主动关闭连接 向对方发送了FIN报文,此时进入到FIN-WAIT-1状态 CLOSE-WAIT:表示在等待关闭 当对方发送FIN给自己,自己会回应一个ACK报文给对方,此时则进入到CLOSE-WAIT状态 在此状态下,需要考虑自己是否还有数据要发送给对方,如果没有,发送FIN报文给对方 FIN-WAIT-2:只要对方发送ACK确认后,主动方就会处于FIN-WAIT-2状态,然后等待对方发送FIN报文 CLOSING:一种比较罕见的例外状态 表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文 如果双方几乎在同时准备关闭连接的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态 表示双方都正在关闭连接 LAST-ACK:被动关闭一方在发送FIN报文后,最后等待对方的ACK报文 当收到ACK报文后,即可进入CLOSED状态了 TIME-WAIT:表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可进入CLOSED状态了 如果FIN-WAIT-1状态下,收到了对方同时带FIN标志和ACK标志的报文时 可以直接进入到TIME-WAIT状态,而无须经过FIN-WAIT-2状态 CLOSED:关闭状态 由于有些状态的时间比较短暂,所以很难用netstat命令看到,比如SYN-RCVD、FIN-WAIT-1等

四次挥手的注意事项 TCP/IP协议栈在设计上,允许任何一方先发起断开请求。这里演示的是client主动要求断开 client发送ACK后,需要有个TIME-WAIT阶段,等待一段时间后,再真正关闭连接,一般是等待2倍的MSL(Maximum Segment Lifetime,最大分段生存期)

  1. MSL是TCP报文在Internet上的最长生存时间
  2. 每个具体的TCP实现都必须选择一个确定的MSL值,RFC 1122建议是2分钟
  3. 可以防止本次连接中产生的数据包误传到下一次连接中(因为本次连接中的数据包都会在2MSL时间内消失了)

如果client发送ACK后马上释放了,然后又因为网络原因,server没有收到client的ACK,server就会重发FIN 这时可能出现的情况是

  1. client没有任何响应,服务器那边会干等,甚至多次重发FIN,浪费资源
  2. client有个新的应用程序刚好分配了同一个端口号,新的应用程序收到FIN后马上开始执行断开连接的操作,本来它可能是想跟server建立连接的

为什么释放连接的时候,要进行4次挥手?

TCP是全双工模式 第1次挥手:当主机1发出FIN报文段时 表示主机1告诉主机2,主机1已经没有数据要发送了,但是,此时主机1还是可以接受来自主机2的数据 第2次挥手:当主机2返回ACK报文段时 表示主机2已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的 第3次挥手:当主机2也发送了FIN报文段时 表示主机2告诉主机1,主机2已经没有数据要发送了 第4次挥手:当主机1返回ACK报文段时 表示主机1已经知道主机2没有数据发送了。随后正式断开整个TCP连接