为什么要学习网络协议?
随着物联网、音视频、直播等领域的发展,企业提高对开发人员网络基本功的要求,经常问网络协议的面试题。
- 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 串行接口
上网方式:
- ** 电话线上线**
这就是平时说的:ADSL电话拨号上网(Asymmetric ) 非对称数字用户线路,提供上、下行不对称的传输带宽 猫(Modem),调制解调器,进行数字信号和模拟信号的转换
- 光纤上网
光猫(Optical Modem ),光调制解调器,进行数字信号和光信号的转换
-
网线上网
-
家用路由器
什么是协议?
类比租房协议
计算机之间如何通信
- 需要得知对方的IP地址
- 最终是根据 地址(网卡地址),输送数据到网卡,被网卡接收
- 如果网卡发现数据的目标 地址是自己,就会将数据传递给上一层进行处理
- 如果网卡发现数据的目标 地址不是自己,就会将数据丢弃,不会传递给上一层进行处理
计算机之间的连接方式:
同轴电缆:
特点:
- 半双工通信
- 容易冲突
- 不安全
- 中间断了,整个都瘫了
集线器(HUB):
特点:
- 半双工通信
- 容易冲突
- 不安全
- 跟同轴电缆一样:没有智商
网桥(bridge)
特点: 能够通过自学习得知每个接口那侧的MAC地址 从而起到隔绝冲突域的作用
交换机(switch)
特点:
- 相当于接口更多的网桥
- 全双工通信
- 比集线器安全
思考:全球所有的设备都用交换机连接会是什么情况?
路由器(router):
特点: 网线直连、同轴电缆、集线器、网桥、交换机,连接的设备必须在同一网段,连接的设备处在同一广播域。 路由器,可以在不同网段之间转发数据,隔绝广播域。
MAC地址
mac地址又称网卡地址,是用有一个6字节(48bit)的mac地址表示的;
特点:
- 全球唯一,固化在了网卡的ROM中,由IEEE802标准规定。
- 前三个字节,(OUI)组织标识符,由IEEE的注册管理机构分配给厂商的。
- 后三个字节,表示网络接口标识符,有厂商自行分配。
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)缓存
- 存储时间比较短(默认是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的主要部分。 它与传输协议(如TCP和UDP)显著不同:它一般不用于在两点间传输数据。它通常不由网络程序直接使用,除了ping和traceroute这两个特别的例子。 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地址
计算机和其他计算机通信前,会先判断目标主机和自己是否在同一网段
- 同一网段:不需要由路由器进行转发
- 不同网段:交由路由器进行转发
IP网址的分类
| 地址类型 | 特征 | 介绍 |
|---|---|---|
| A类地址 | 第一位为0,注意是位 |
- 第1字节为网络地址,其它3个字节为主机地址
- 地址范围:1.0.0.1—126.255.255.254
- 10.X.X.X是私有地址,范围从10.0.0.0-10.255.255.255
- 127.X.X.X是保留地址,用做环回测试。
- 容纳最大主机数:2的24次方 – 2 = 16777214 | | B类地址 | 前两位为10,注意是位 |
- ** 第1字节和第2字节为网络地址,后2个字节为主机地址**
- 地址范围:128.0.0.1—191.255.255.254
- 私有地址范围:172.16.0.0—172.31.255.255
- 保留地址:169.254.X.X
- 容纳最大主机数:2的16次方 – 2 = 65534 | | C类地址 | 前三位为110,注意是位 |
- 前三个字节为网络地址,最后字节为主机地址
- 地址范围:192.0.0.1—223.255.255.254
- 私有地址:192.168.X.X,范围从192.168.0.0-192.168.255.255
- 容纳最大主机数: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 |
注意:
- 只有A\B\C类地址才能分配给主机
- 主机ID为全0,表示主机所在的网段
- 主机ID为全1,表示主机所在网段的全部主机(广播)
- 可以尝试用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地址数量是一样的
- 变长子网划分:每个子网的可用IP地址数量可以是不一样的
什么是超网
超网:跟子网反过来,它是将多个连续的网段合并成一个更大的网段
** 需求:原本有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位)
合并网段的规律
- 如果第一个网段的网络号能被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)
- 多对一转换,最大程度节约公网 资源
- 采用端口多路复用方式,通过端口号标识不同的数据流
- 前应用最广泛的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
// 多路复用的方式
网络分层与常见协议
物理层
物理层主要指的是硬件(网线,交换机,路由器等)。定义了接口标准,线缆标准,参数速率,传输方式等;
数据通信模型
模拟信号
特点:1. 连续的信号,适合长距离阐述。2. 抗干扰能力差,受到干扰时波形变形很难纠正。
数字信号
特点:1.离散的信号,不适合长距离传输。2. 抗干扰能力强,受到干扰时波形失真可以修复。
信道(channel)
信道:信息传输的通道,一条传输介质上(比如网线)上可以有多条信道
- 单工通信 信号只能往一个方向传输,任何时候都不能改变信号的传输方向 比如无线电广播、有线电视广播
- 半双工通信 信号可以双向传输,但必须是交替进行,同一时间只能往一个方向传输 比如对讲机
- 全双工通信 信号可以同时双向传输 比如手机(打电话,听说同时进行)
数据链路层(Data Link)
链路:从1个节点到相邻节点的一段物理线路(有线或无线),中间没有其他交换节点。 数据链路:在一条链路上传输数据时,需要有对应的通信协议来控制数据的传输。
常见链路层协议:
- 广播信道:CSMA/CD协议(比如同轴电缆、集线器等组成的网络)
- PPP协议(比如2个路由器之间的信道)
数据链路层的3个基本问题
- 封装成帧
帧(Frame)的数据部分就是网络层传递下来的数据包(IP数据包,Packet)
最大传输单元MTU(Maximum Transfer Unit)
- 每一种数据链路层协议都规定了所能够传送的帧的数据长度上限
- 以太网的MTU为1500个字节
- 透明传输
特点:
- 使用SOH(Start Of Header)作为帧开始符
- 使用EOT(End Of Transmission)作为帧结束符
- 如果数据包包含了SOH或者EOT,需要进行转义
- 差错检验
FCS是根据数据部分 + 首部计算得出的
CSMA/CD协议
CSMA/CD(Carrier Sense Multiple Access with Collision Detectio,载波侦听多路访问/冲突检测
使用了CSMA/CD的网络可以称为是以太网(Ethernet),它传输的是以太网帧。以太网帧的格式有:Ethernet V2标准、IEEE的802.3标准。使用最多的是:Ethernet V2标准。
用交换机组建的网络,已经支持全双工通信,不需要再使用CSMA/CD,但它传输的帧依然是以太网帧。所以,用交换机组建的网络,依然可以叫做以太网。
解释:以集线器为例,(半双工通信)
- 载波监听,是可以监听信道是否有消息。
- 多路访问,每个机器都可以进行通信。
- 为了能够检测正在发送的帧是否产生了冲突,以太网的帧至少要64字节。
Ethernet V2标准。
首部:目标MAC +源MAC + 网络类型 ◼ 以太网帧:首部 + 数据 + FCS ◼ 数据的长度至少是:64 – 6 – 6 – 2 – 4 = 46字节
数据不够的情况: 当数据部分的长度小于46字节时 数据链路层会在数据的后面加入一些字节填充 接收端会将添加的字节去掉
长度总结
- 以太网帧的数据长度:46~1500字节
- 以太网帧的长度:64~1518字节(目标MAC +源MAC + 网络类型 + 数据 + FCS)
注意: ◼ 网卡接收到一个帧,首先会进行差错校验,如果校验通过则接收,否则丢弃 ◼ Wireshark抓到的帧没有FCS ,因为它抓到的是差错校验通过的帧(帧尾的FCS会被硬件去掉) Wireshark抓不到差错校验失败的帧
PPP协议(Point to Point Protacol)
特点:
Address字段:图中的值是0xFF,形同虚设,点到点信道不需要源MAC、目标MAC地址
◼ Control字段:图中的值是0x03,目前没有什么作用
◼ Protocol字段:内部用到的协议类型
◼ 帧开始符、帧结束符:0x7E
网络层(Network)
网络层数据包(IP数据包,Packet)由首部、数据2部分组成。数据:很多时候是由传输层传递下来的数据段(Segment)
版本(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
由于帧的数据不能超过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代表是最后一片
如何分片
特点:片偏移(Fragment Offset)
占13位
片偏移乘以8:字节偏移
每一片的长度一定是8的整数倍
协议(Protocol)
占8位
表明所封装的数据是使用了什么协议
首部校验和(Header Checksum)
用于检查首部是否有错误
传输层(transport)
传输层有2个协议
TCP(Transmission Control Protocol),传输控制协议
UDP(User Datagram Protocol),用户数据报协议
UDP
UDP是无连接的,减少了建立和释放连接的开销
UDP尽最大能力交付,不保证可靠交付
因此不需要维护一些复杂的参数,首部只有8个字节(TCP的首部至少20个字节)
特点:
UDP长度(Length)
占16位,首部的长度 + 数据的长度
UDP检验和(Chgecksum)
检验和的计算内容:伪首部 + 首部 + 数据
伪首部:仅在计算检验和时起作用,并不会传递给网络层
常见占用默认端口
特点:
◼ UDP首部中端口是占用2字节
可以推测出端口号的取值范围是:0~65535
◼ 客户端的源端口是临时开启的随机端口
◼ 防火墙可以设置开启\关闭某些端口来提高安全性
常用命令行 netstat –an:查看被占用的端口 netstat –anb:查看被占用的端口、占用端口的应用程序
TCP协议
数据格式
数据偏移
占4位,取值范围是0x0101
0x1111
乘以4:首部长度(Header Length)
首部长度是2060字节
保留
占6位,目前全为0
注意事项:
- 有些资料中,TCP首部的保留(Reserved)字段占3位,标志(Flags)字段占9位,Wireshark中也是如此
- UDP的首部中有个16位的字段记录了整个UDP报文段的长度(首部+数据)
- 但是,TCP的首部中仅仅有个4位的字段记录了TCP报文段的首部长度,并没有字段记录TCP报文段的数据长度
- UDP首部中占16位的长度字段是冗余的,纯粹是为了保证首部是32bit对齐,TCP\UDP的数据长度,完全可以由IP数据包的首部推测出来
- 传输层的数据长度 = 网络层的总长度 – 网络层的首部长度 – 传输层的首部长度
TCP检验和
跟UDP一样,TCP检验和的计算内容:伪首部 + 首部 + 数据
伪首部:占用12字节,仅在计算检验和时起作用,并不会传递给网络层
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的几个要点
- 可靠传输
- 流量控制
- 拥塞控制
TCP可靠传输-停止等待ARQ协议
** ARQ(Automatic Repeat–reQuest),自动重传请求**
问题:若有个包重传了N次还是失败,会一直持续重传到成功为止么?
这个取决于系统的设置,比如有些系统,重传5次还未成功就会发送reset报文(RST)断开TCP连接
TCP可靠传输-连续APQ协议+滑动窗口
问题:
但发送方只发了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)
问题:为什么选择在传输层就将数据“大卸八块”分成多个段,而不是等到网络层再分片传递给数据链路层?
因为可以提高重传的性能
需要明确的是:可靠传输是在传输层进行控制的
如果在传输层不分段,一旦出现数据丢失,整个传输层的数据都得重传
如果在传输层分了段,一旦出现数据丢失,只需要重传丢失的那些段即可
TCP-流量控制
如果接收方的缓存区满了,发送方还在疯狂着发送数据 接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源 所以要进行流量控制 什么是流量控制? 让发送方的发送速率不要太快,让接收方来得及接收处理 原理 通过确认报文中窗口字段来控制发送方的发送速率 发送方的发送窗口大小不能超过接收方给出窗口大小 当发送方收到接收窗口的大小为0时,发送方就会停止发送数据
问题:有一种特殊情况 一开始,接收方给发送方发送了0窗口的报文段 后面,接收方又有了一些存储空间,给发送方发送的非0窗口的报文段丢失了 发送方的发送窗口一直为零,双方陷入僵局 解决方案 当发送方收到0窗口通知时,这时发送方停止发送报文 并且同时开启一个定时器,隔一段时间就发个测试报文去询问接收方最新的窗口大小 如果接收的窗口大小还是为0,则发送方再次刷新启动定时器
TCP-拥塞控制
拥塞控制
防止过多的数据注入到网络中
避免网络中的路由器或链路过载
拥塞控制是一个全局性的过程
涉及到所有的主机、路由器
以及与降低网络传输性能有关的所有因素
是大家共同努力的结果
比而言,流量控制是点对点通信的控制
如何解决?
- 慢开始(slow start,慢启动)
- 拥塞避免(congestion avoidance)
- 快速重传(fast retransmit)
- 快速恢复(fast recovery)
几个缩写 MSS(Maximum Segment Size):每个段最大的数据部分大小 在建立连接时确定 cwnd(congestion window):拥塞窗口 rwnd(receive window):接收窗口 swnd(send window):发送窗口 swnd = min(cwnd, rwnd)
慢开始
cwnd的初始值比较小,然后随着数据包被接收方确认(收到一个ACK)
cwnd就成倍增长(指数级)
拥塞避免
ssthresh(slow start threshold):慢开始阈值,cwnd达到阈值后,以线性方式增加
拥塞避免(加法增大):拥塞窗口缓慢增大,以防止网络过早出现拥塞
乘法减小:只要网络出现拥塞,把ssthresh减为拥塞峰值的一半,同时执行慢开始算法(cwnd又恢复到初始值)
当网络出现频繁拥塞时,ssthresh值就下降的很快
快重传
接收方
每收到一个失序的分组后就立即发出重复确认
使发送方及时知道有分组没有到达
而不要等待自己发送数据时才进行确认
发送方
只要连续收到三个重复确认(总共4个相同的确认),就应当立即重传对方尚未收到的报文段
而不必继续等待重传计时器到期后再重传
快恢复
当发送方连续收到三个重复确认,说明网络出现拥塞 就执行“乘法减小”算法,把ssthresh减为拥塞峰值的一半 与慢开始不同之处是现在不执行慢开始算法,即cwnd现在不恢复到初始值 而是把cwnd值设置为新的ssthresh值(减小后的值) 然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大
发送窗口的最大值 发送窗口的最大值:swnd = min(cwnd, rwnd) 当rwnd < cwnd时,是接收方的接收能力限制发送窗口的最大值 当cwnd < rwnd时,则是网络的拥塞限制发送窗口的最大值
序号,确认号
紫色客户端发的,蓝色服务端回的
tcp的三次握手
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次挥手
状态 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,最大分段生存期)
- MSL是TCP报文在Internet上的最长生存时间
- 每个具体的TCP实现都必须选择一个确定的MSL值,RFC 1122建议是2分钟
- 可以防止本次连接中产生的数据包误传到下一次连接中(因为本次连接中的数据包都会在2MSL时间内消失了)
如果client发送ACK后马上释放了,然后又因为网络原因,server没有收到client的ACK,server就会重发FIN 这时可能出现的情况是
- client没有任何响应,服务器那边会干等,甚至多次重发FIN,浪费资源
- 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连接