网络结构
如果你家里要上网,电信运营商(ISP)的师傅会在你家安装一直光猫,而在远方的另一端的电信服务器上也接了一只光猫,光猫的作用就是电信号和光信号之间的相互转换。信号的远程传输走的是光信号(光缆),到你家之后经过光猫变成电信号,另一端也是如此。光猫一边插在光缆上,另外一边接的是根网线。网线里是8根双绞线,从网线出来时已经是电信号了,光猫于是通过这跟网线连上你家的路由器。路由器就可以为你家开启各种服务,所有的无线设备都可以通过无线路由连上无线信号进行上网了。路由器还会接出网口。网口可以接有线信号。连接主机后,主机就能上网了。
使用流量的情况:比如手机里的电话卡。手机就能通过流量信号和基站进行沟通。基站大多是4G基站,按蜂窝状部署,覆盖道路和城市。基站也就相当于一个局域网,会为每一台设备临时分配一个ip地址。
NAT网关会对内外ip进行管理。
如果恰巧你在极地,那里没有基站(破坏生态,还很难维护)。那就只能通过卫星通讯,走卫星信号了。(例如,电影里间谍用卫星通讯,别人无法监听)
有一次一家外贸公司网断了,请运营商师傅看了一下,结果信号到光猫那里都是没问题的。那就是公司内部网络的问题,跟运营商没关系了,于是师傅拍拍屁股走人。留下公司的人蒙圈不已,之后找了个会修网络的人来看了看,发现路由器两端的ip地址被设成一样的了。于是改成不一样后,网络恢复正常了。但还有几台电脑不能上网,过去看了看,发现电脑获取ip地址被写死了,于是改成自动获取ip地址,就可以了。
还有一次在一家金融公司,设计网络的人一开始没设计好,192.168.1.xxx,这样的C类网段相当于只有254个IP地址可用,公司本来就有200多人,每人一台电脑外加手机,所以只要公司里出差的人少了,就开始打架了,ip地址不断地被挤来挤去。搞笑的是有人居然把服务器地ip地址给挤下来了,导致公司服务系统停了。这个时候就写死一个ip地址不断地挤一个地址,相比自动获取不会吃亏一些。。。
一般像电信连上来的光猫,它的局域网ip地址一般是192.168.0.1。
路由器两端是不同的网段。而交换机是同网段的。
交换机的作用就是连接多台设备,有许多个网口,可以插上主机。主机之间可以通过交换机进行数据的传输。
Hub(桥接器):向所有端口转发,较交换机而言不太智能。
局域网最终是要连接到主干道上。比如说你家里的可能就要连到小区的主干道,然后再连到市一级的主干道,再连到国家级主干道,主干道一般分成几级,越高级的速度越快。这些都是由运行商来维护的,
国家级还能再连到国外级,但我们国家中间有一道门(墙),把外面的东西都拦了起来,保护了国内互联网,所以也被人戏称大的局域网。也有人会搭副梯子(挂个VPN)翻出去。
曾经腾讯和360大战,360杀毒软件看到腾讯QQ就死命地杀,腾讯QQ看到360软件就疯狂提示你卸载。鱼和熊掌不可兼得,于是就删了个QQ,没了通信软件就用国外的。但发现并没有意义,因为认识的人都在国内。于是又卸载了。
除了家里的,公司的,移动流量的,网络结构还有云环境,云主机通过路由的VPC虚拟私有云来上网
数字用户线路DSL
早期的猫其实就是DSL调制解调器。
早期的时候走的是国家电话线路,全部是在电话线路上上网的。网络不过是作为电话的附属的东西。家里拉一根电话线,利用调制解调器调成网络信号。调制和解调相当于翻译的作用,电话信号翻译成网络信号
混合光纤同轴电缆HFC
随着时代发展,用的都是光纤,光信号了。也需要调制解调,有一个CMTS的作用就是把主干路上下来的电信号对他进行一些计算,把他转成光信号,再发出去。每家每户再装一只光猫,把光信号再转成电信号
IP地址+CIDR:
比如寝室里四个人魔兽联机,一台路由器连着四台电脑。一个人建好了一个房间,另外的人查找不到。这时查看自己电脑的ip地址是什么,然后检测电脑到路由器通不通(是不是网线没插紧呀),然后再确定电脑之间通不通。
查看ip地址:
windows上:ipconfig
linux上:ifconfig / ip addr(cls:清屏)
下面每一块都可以理解为是一个网卡:
docker0:docker网卡
eth0是云主机上的网卡。
lo是回环网卡(loopback)
veth 是虚拟网卡每块网卡都会有一个ip地址,ip地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号。
IPV4的地址是32位的。还被分成了5类:
最高位为0的是A类,最大主机数 = 2^24-2 =16,777,214
——主机号全0要作为网络号来用。主机号全1作为广播号地址。
——点分十进制:每一个点后的数字都是对应的8位二进制。
A类:0 对应0000 0000,127 对应 0111 1111
B类:128 对应1000 0000,191对应1011 1111
C类:192 对应1100 0000,255对应1101 1111
(如果在家里要建私有ip的话要遵循右边的规则。)
缺点:上述ip地址设置的方法缺陷就在于不够灵活,很不方便也很不自由。而且早期分的太奢侈了。对于一家公司来说,最大主机数C太少,B又太多。
无类型域间选路CIDR:
这是一种折衷的方式,将32位IP地址一分为二,前面是网络号,后面是主机号。从哪里分呢?比如:192.168.0.169/24,地址中有一斜杠,后有个数字24。这种地址表示形式,就是CIDR
意思:前24位是网络号,后8位是主机号。
伴随CIDR存在的:
一个是广播地址, brd 192.168.0.255 如果发送这个地址,所有192.168.0 网络里的机器都可以收到。
另一个是子网掩码,netmask 255.255.255.0。子网掩码和ip地址相与& 就是我的网络号。
私有IP:就比如我所在云主机所在局域网的IP地址。只要在不同的局域网里,ip地址重复就没有关系
——比如我们都住在3幢106单元,但是是在不同的小区。就不会搞混。
公网IP:就是我上到互联网以后,我向全世界公开的地址。公有IP需要买,全球唯一。
MAC地址:
link/ether fa:16:3e:fb:98:34 brd ff:ff:ff:ff:ff:ff
6个字节表达MAC地址。是一个网卡的物理地址,用十六进制。MAC地址全局唯一,不会有两个相同的MAC地址,而且网卡自生产出来,就带着这个地址。任何东西要上网都要一个有线或无线网卡。
网卡的作用是:负责向网线里进行数据的读写。把数据的读写变成网线上高低电平的电信号,发送出去。
既然MAC地址全球唯一,那何必要用IP地址呢?
MAC地址的功能类似于身份证,而IP地址的功能类似于收货地址
你如果只写了身份证,快递员上哪里找去呢?所以ip地址是快速找到快递去哪,而MAC地址是验证最终到底是不是那个人。
除非你已经到那了,MAC才可以起到一定的定位功能。
网络设备的状态标识:
<BROADCAST, MULTICAST , UP, LOWER_UP>
这个叫做net_device flags ,网络设备的状态标识。
UP:表示网卡处于启动的状态。
BROADCAST:表示这个网卡有广播地址,可以发送广播包。局域网内所有人都能收到的包。
MULTICAST:表示网卡可以发送多播包
LOWER_UP:表示L1是启动的,也即网线插着呢。
MTU1500:是指最大传输单元MTU为1500,这是以太网的默认值,以太网规定正文部分不允许超过1500个字节。正文里面有IP的头,TCP的头、HTTP的头。如果放不下,就需要分片来传输。
qdisc pfifo_fast
qdisc全称是queueing disipline 叫排队规则。内核如果需要通过某个网络接口发送数据包,它都需要按照qdisc(排队规则)把数据包加入队列。最简单的qdisc是pfifo ,它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。pfifo_fast 稍微复杂一些。
DHCP协议
你家来了一个新来的机器要上网,这台新机器只有MAC地址而没有IP地址,现在他就需要“租个房子”,配个IP地址:
新的机器使用IP地址0.0.0.0发送了一个广播包,目的IP地址为255.255.255.255。广播包封装了UDP,UDP封装了BOOTP。其实DHCP是BOOTP的增强版。
在这个广播包里,新人大喊:我是新来的(Boot request),我的MAC地址是这个,我还没有IP,谁能则租给我一个IP地址!
UDP协议主要解决端口问题:同一个IP地址上的同一个服务器有多种不同的服务的时候,每个服务在哪。
源端口:68,目标端口67.
如果网络里面配置了DHCP Server的话,他就相当于这些IP的房东。他立刻能知道来了一个新人,需要租给他一个IP地址,这个过程称为DHCP Offer 。DHCP Server为此客户保留为它提供的IP地址,不会为其它DHCP客户分配此IP地址。(房子我给你留好了,不会租给别人了)
DHCP Server 会做出应答:仍然使用广播地址作为目的地址,因为此时请求分配IP地址的新人还没有IP地址。DHCP Server 回复说:"我分配了一个可用的IP地址给你,你看如何。"除此之外服务器还发送了子网掩码、网关、和IP地址租用期等信息
新来的机器可能会收到多个IP地址,他会选择其中一个DHCP Offer,一般是最先到达的那个,并且会向网络发送一个DHCP request 广播数据包,包中包含客户端的MAC地址、接受的租约中的IP地址、提供此租约的DHCP服务器地址等,并告诉所有的DHCP server 他将接受哪一台服务器提供的IP地址,告诉其他DHCP服务器:谢谢你们的接纳,并请求撤销他们提供的IP地址,以便提供给下一个IP租用请求者。
当DHCP Server接受到客户机的DHCP request之后,会广播返回给客户机一个DHCP ACK消息包,表明已经接受客户机的选择,并将这一IP地址的合法租用信息和其他的配置信息都放入该广播包,发给客户机,欢迎它加入网络大家庭,最终租约达成的时候,还是需要广播一下,让大家都知道。(这个新人的IP是我这里租的,租约在此!)
但是除了计算机自己用DHCP设置IP地址,你其实也可以自己设置IP地址:网络共享中心-更改适配器-属性-IPV4-使用下面的IP地址-设好子网掩码和广播地址和IP地址,你就已经进去了。
什么是协议:
语法:内容要符合一定的规则和格式。例如这一部分写几个字节,下一个部分写几个字节。
语义:这一段内容代表某种意义,例如这几个个字节什么意思,那几个字节什么意思,代表什么。
顺序:就是先干啥,后干啥。
一、OSI七层模型:开放式系统互联通信参考模型
物理层:把电脑连在一起,用的是网线。集线器是hub。协议规定网口的大小、硬件的大小规范。
数据链路层:搞清楚你发送的数据,寄件人和收件人都是谁。PPP 宽带拨号上网
传输层:最大问题在于进程和端口的对应。一台服务器上有多个服务。只有传输层及以上级别的层才会有端口
传输层以上这三层可以合并成应用层,软件内部。
二、TCP/IP五层模型:
传输层以上的三层合并为应用层之后的模型叫做TCP/IP五层模型,
TCP和IP协议由于其代表性,分别表示一个协议簇。
1. 物理层:
两个人,两台电脑。能不能连在一起组网玩联机游戏呢?
一根网线,有两个头。一头插在一台电脑的网卡上,另一头插在另一台电脑的网卡上。
水晶头要做交叉线,用的就是所谓的1-3、2-6交叉接法。水晶头的第1、2和第3、6脚分别起着收、发信号的作用。将一端的1号和3号线、2号和6号线互换一下位置,就能够在物理层实现一端发送的信号,另一端能收到。
等到第三个哥们也买了一台电脑,怎么把三台电脑连在一起呢?
有一个叫Hub的东西,也就是集线器。这种设备有多个口,可以将宿舍里的多台电脑连接起来。但是,和交换机不同,集线器没有大脑,他完全在物理层工作。他会将收到的每一个字节,都复制到其他端口上去。这是第一层物理层联通的方案。
2. 数据链路层:
Hub采取的是广播模式,如果每一台电脑发出的包,宿舍的每个电脑都能收到,那就麻烦了。
这就需要考虑这几个问题:
1. 这个包是发给谁的?谁应该接受?
2. 大家都在发,会不会产生混乱?有没有谁先发、税后发的规则?
3. 如果发送的时候出现了错误,怎么办?
这几个问题,都是第二层,数据链路层,也即MAC层要解决的问题。
第一个问题:
牵扯到第二层的网络包格式。对于以太网,第二层的最开始,就是目标MAC地址和源MAC地址。
这里涉及一个问题:数据包怎么知道目的MAC地址?
第三个问题:
对于以太网,第二层的最后面是CRC,也就是循环冗余检测。通过XOR异或的算法,来计算整个包是否在发送的过程中遇到了错误,出错的话,在网卡这一层就直接把他给扔了。主要解决第三个问题。
第二个问题:
MAC的全称是Medium Access Control,即媒体访问控制,控制什么呢?
其实就是控制在往媒体上发数据的时候,谁先发,谁后发的的问题。防止发生混乱。这解决的是第二个问题。这个问题中的规则,学名叫多路访问。有很多算法可以解决这个问题。就像车管所灌输马路上跑的车。
1. 信道划分。
2. 抢令牌。
3. 随机接入协议,著名的以太网就是用的这种方式。
3. 网络层(IP层):
电脑之间进行连接,还需配置这两台的IP地址、子网掩码和默认网关,要想电脑之间能通信,这三项必须配置成一个网络(局域网),否则是连不通的。
ARP协议(address resulotion protocol):
之前还有一个没有解决的问题:当原机器知道目标机器的时候,可以将目标地址放入包里面,但如果不知道呢?同一个局域网里面接入了N台机器,我怎么知道每个IP地址对应的MAC地址是谁呢?
也就是已知IP地址,求MAC地址的协议:
在一个局域网里面,当知道了IP地址,不知道MAC怎么办呢?
arp -a
windows/linux命令:arp表记录并可以查看IP地址和MAC地址的对应关系,曾经通信过的对象都会被记录。这个关系可能会变,因为机器不断地上下线,IP地址可能会被更新,所以表的内容也会过期,需要时常更新。
所以会先在arp表中查,能查到最好。
那没查到就广播:“我是xxxx(IP地址),我的MAC是xxx,谁是192.168.0.103,你的MAC是啥?”
然后目标机器B产生ARP应答:“你好我是xxx,我的MAC是xxx,你是xxx,你的MAC是xxx”
然后机器A缓存IP-MAC映射
交换机:
因为每个口都只连接一台电脑,这台电脑又怎么换IP和MAC地址,只要记住这台电脑地MAC地址,如果目标MAC地址不是这台电脑的,这个口就不用转发了。交换机会通过学习,记住目标MAC。
ICMP与ping:
ping是基于ICMP协议工作的。ICMP全称 Internet Control Message Protocol就是互联网控制报文协议
网络包在异常复杂的网络环境中传输时,常常会遇到各种各样的问题。到遇到问题的时候,总不能死个不明不白,要传出消息来,报告情况,这样才可以调整传输策略。(扮演一个侦察兵的角色)
ICMP报文是封装在IP包里的。ICMP报文有很多类型,不同类型有不同的代码。主动请求的类型为8,主动请求的应答为0
TTL(time to live):源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位就不是秒,而是跳(hop)。
TCP协议和ICMP协议都是基于IP协议,但是ICMP和IP协议处在同一层,只不过是因为,他跟端口没扯上关系,就没把它放在传输层。
ICMP报文常见的类型有:
网络报文封装过程和路由器功能:
网络封包和解包的过程就跟寄东西一样,比如你要寄个指甲刀,不可能快递员拿着指甲刀就走。肯定要先包装好,贴上标签,运往不同的地方,再贴上各种的标签。
首先ping命令是一个程序,是一个进程。程序运行起来开始发包:
1. 先在ICMP层进行组装 8,0 这是一个请求包。
2. 然后传给IP层贴上源IP和目标IP地址。
3. 接着传给MAC层贴上目标MAC和源MAC。(通过ARP表直接去查询对方MAC是谁,没有就发起ARP应答)
4. 这些都贴完以后扔给网口,再通过网口扔进网线里。
5. 网线可能是通过交换机或其它设备连在一个局域网里
这是从上往下封包的过程,对方接受到以后有一个从下往上拆包的过程。
路由器(Router):
tplogin.cn
家庭路由器会有内网网口(LAN)和外网网口(WAN),把外网网口的线插到光猫(Modem)拉出的网线的网口上。将这个外网网口配置成和光猫的局域网一样。内网网口连上家里的所有电脑。
路由器将多个局域网相连,每个局域网的出口就叫网关。
如果不是同一网段的想要通信,就需要把数据包法网默认网关(Gateway)网关的地址一定是和源IP地址是一个网段的,往往不是第一个,就是第二个。发给网关的方法就跟发给同网段的其他机器是一样的。
任何一个想发往其他局域网的包,都会到达其中一个网关,被拿进来,拿下MAC头和IP头,看看,根据自己的路由算法,选择另一个网口,加上IP头和MAC头,然后扔出去。
静态路由:
路由器中都会有一张静态路由表,就是在路由器上,配置一条一条规则。
每当要选则从哪个网口抛出去的时候,就一条一条地匹配规则,找到符合的规则,就按规则中设置地那样,从某个口抛出去。
windows 查看路由表:
route printlinux 查看路由表:
route
netstat -rn
0.0.0.0 匹配所有网段。
转发的过程中源IP和目标IP地址是不变的,变的只是源MAC和目标MAC,(可见IP地址相当于收货地址,MAC相当于代表不同的人的身份证,包裹在不同的人之间传递,但收件人和发件人是不会变的)
这里还有一个问题:因为局域网之间没有商量过,各定各的网段,因而出现IP冲突的问题。看上去像是自己传给自己。怎么解决呢?——公网IP(国际身份)
把目标IP换成对方的公网IP就行了。
并且当数据包到达网关即将发出去的时候。源IP地址也会改成网关的公网IP。这样做的目的是方便别人给你回信。
NAT网关(NetWork Address Translation):
是一对多的映射关系。假设有三台主机在同一个局域网内并且共享一个公网IP,外界看来他们的IP地址都是哪个公网IP,如何做区分呢?——通过端口号来区分
whatismyip.com 查看自己的出口IP地址
linux抓包:tcpdump + 包的类型(icmp)
当你在云主机上ping你的电脑的IP的时候显示是通的,但是小鲨鱼(wireshark)并没有抓到包。这是怎么一回事呢?
说明电信运营商帮你收到了这个包,但是并没有把这个包给放进来。(这样做也有好处,防止黑客入侵)除非你内网穿透。
虚拟机:
打开虚拟网络编辑器,
桥接模式:直接搭在了你的一张网卡上。和你的电脑是平级的。
NAT模式:把我的主机当成虚拟机的外网。主机IP相当于变成虚拟机的公网IP,会通过NAT映射,映射到虚拟机的子网IP。
NAT设置可以设置:虚拟机的子网IP、子网网关、端口转发(把发到主机上的数据转发给虚拟机)。
动态路由算法:
当网络环境复杂并且多变的时候,如果总是用静态路由,手工修改路由实在太复杂了。因而需要动态路由算法。
第一大类的算法称为距离矢量路由(distance vector routing)基于Bellman-Ford算法。
每个路由器都保存一个路由表,包含多行,每行对应网络中得一个路由器,每行包含两部分信息,一个是到目标路由器,要从哪出去;另一个是到目标路由器的距离。由此看出,每个路由器都是知道全局信息的。
每过几秒,每个路由器都将自己所知的到达所有的路由器的距离告知邻居,每个路由器也能从邻居那里得到相似的信息。每个路由根据邻居的信息,计算和其他路由器的距离,并更新最短路。
但这种算法有一个缺陷:1. 好消息传得块,坏消息传得慢。
比如原本有两个人A和B他们之间距离为1,这时新来了一个C距离B为1:
那么B和C很快就能更新到C得距离。
而一旦C消失了,B就找不到C了,但是A“以为”它能找到,在距离它为2的位置。B一听,那么我应该距离C三的位置。A一听坏了,你是3那我不就变成4了。。。。。如此循环往复,一直到超过了某一阈值,他们才真的确定C消失了。
2. 每次发送的时候,要发送整张全局路由表,网络大了谁也受不了。(早期路由协议RIP就是这种算法)
第二大类的算法称为链路状态路由(link state routing)基于dikstra算法。
当一个路由器启动的时候,第一步是发现邻居,向邻居say hello 。然后邻居都回复它。于是路由开始计算和邻居的距离,发送一个echo 要求马上返回,除以二就是距离
然后将自己和邻居之间的链路状态包广播出去,发送到整个网络的每个路由器。这样每个路由器都能接收到它和它邻居之间的关系的信息。因而,每个路由器都能在自己本地构建一个完整的图,然后针对这个图使用dikstra算法,找到两点之间的最短路径。链路状态路由只广播更新的或改变的网络拓扑,这使得更新信息更小,节省了带宽和CPU利用率。而且一旦一个路由器挂了,它的邻居都会广播这个消息,可以使得坏消息迅速收敛。
1. 基于链路状态路由算法的OSPF协议(Open Shortest Path First)
开放式最短路径优先。
广泛应用在数据中心中的协议。由于主要用在数据中心内部,用于路由决策,因而称为内部网关协议(Interior Gateway protocol简称IGP),内部网关协议的重点就是找到最短的路径。在一个组织内部,路径最短往往最优。当然有时候OSPF可以发现多个最短的路径,可以在这多个路径中进行负载均衡(数据量很大)。这常常被称为等价路由。
2. BGP协议:
基于路径矢量路由协议。是他的升级版。是自治系统间的路由协议,BGP交换的网络可达性信息提供了足够的信息来检测路由回路并根据性能优先和策略约束对路由进行决策。
UDP协议:
UDP段格式:源端口号、目的端口号、UDP长度、UDP校验和、数据。
端口号的范围是0-2^16-1,其中0-1023被很多软件固定占用。(well-known,比如你每次去人民广场都会有肯德基、麦当劳等店占据。)
很多服务有well-known的端口号,然后客户端程序的端口号却不必是well-known的,往往是每次运行客户端程序时由系统自动分配一个空闲的端口号,用完就释放掉。称为ephemeral端口号。
UDP协议不面向连接,也不保证传输的可靠性。
1. 发送端的UDP协议层只管把应用层传来的数据封装成段交给IP协议层就算完成任务了,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
2. 接收端的UDP协议层只管把收到的数据根据端口号交给相应的应用程序就算完成任务了,如果发送端发来多个数据包并且在网络上经过不同的路由,到达接收端时顺序已经错乱了,UDP协议层也不保证按发送时的顺序交给应用层。
3. 通常接收端的UDP协议层将收到的数据放在一个固定大小的缓冲区中等待应用层来提取和处理,如果应用程序提取和处理的速度很慢,而发送端发送的速度很快,就会丢失数据包,UDP协议层并不报告这种错误。
适合场景:
1. 需要资源少,在网络情况较好的内网,或者对于丢包不敏感的应用。
2. 不需要一对一沟通建立连接,而是可以广播的应用
3. 需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞也毫不退缩,一往无前。
TCP协议:
TCP段格式:源端口号(16位)、目的端口号(16位)、序号(32位)、确认序号(32位)、首部长度(4位)、保留(6位)、窗口大小(16位)、校验和(16位)、紧急指针(16位)、选项、数据。
需关注以下问题:
顺序问题:、丢包问题:给包编号。每一个包都有一个ID,在建立连接地时候,会商定其实id是什么,然后按照id一个一个发送。为了保证不丢包,对于发送地包都要进行应答,但是这个应答也不是一个一个来,而是回应大某个之前地id,表示都收到了,这种模式称为累计确认或累计应答:
发货人仓库:发送已确认、发送未确认、未发送可发送、未发送不可发送(看对方仓库大小)
接收人仓库:接收已确认、等待接收未确认、不能接收比如发送方未收到ACK,或者无应答,会超时重试,时间必须大于往返时间RTT,否则会引起不必要地重传,当然也不宜过大,访问速度会变慢。
估计往返时间,需要TCP通过采样RTT的时间,然后进行加权平均,算出一个值,而且这个值还是要不断变化的,因为网络状况不断地变化。除了采样RTT,还要采样RTT的波动范围,计算出一个估计地超时时间。由于重传时间是不断变化的,我们成为自适应重传算法。
如果再次超时,需要重传,TCP会将超时间隔加倍。两次超时,说明网络环境差,不易频繁发送。
快速重传的机制:当接收方收到序号大于下一个所期望的报文段时,就会检测到数据流中的一个间隔,于是向对方发送冗余的ACK,而当客户端收到三个冗余的ACK后,就会在定时器过期之前,重传丢失的报文段。
SACK:在TCP头里加SACK的东西,将缓存的地图发送给对方
连接维护:状态位(SYN:发起连接;ACK:回复;RST:从新连接;FIN:结束连接。TCP是面向连接的,因而双方要维护来连接的状态,这些带状态位的包发送,会引起双方的状态变更。)
TCP流量控制:双方都维护一个窗口大小。
发送方会定时发送窗口探测数据包,看是否有机会调整窗口的大小。当接收方比较慢的时候,要防止低能窗口综合征:当窗口太小的时候,不更新窗口,直到达到一定大小,或者缓冲区一半为空,才更新窗口。
拥塞控制:
通过拥塞窗口cwnd的大小来控制的,怕把网络塞满。网络有带宽:每秒钟能够发送多少数据;端到端有时延 ,在理想状态下,通道的容量=带宽x往返时延。如果设置大宋窗口,使得发送但未确认的包为通道的容量,就能够撑满整个管道。
如果在这基础上体哦啊大窗口,使得单位时间能发更多的包。那么从一端到另一端中间经过的设备单位时间就要处理越来越多的包。超过处理能力的包会被丢弃,这是我们不想看到的。解决办法是给这些设备加上缓存,处理不过来的在队列里排着,但缺点是会增加延时,如果延时到达一定程度,就会超时重传,也是我们不想看到的。
于是TCP拥塞控制主要避免两种现象:包丢失和超时重传。一旦出现了这些现象就说明发送速度太快了,要慢一点。但是一开始怎么知道速度多块呢?我们怎么知道窗口大小应调为多大呢?
1. 慢启动:比如通过漏斗往瓶子里灌水,一开始不能一桶水一下子倒进去,肯定会漫出来。要一开始慢慢倒,然后到后面就可以越来越快。
2. 拥塞控制:当超过某一阈值的时候就要小心点,不能发太快了,要慢下来
3. 快速恢复:当接收端丢了一个中间包,发送三次前一个包的ACK,于是发送端就会快速重传,不必等待超时再传。TCP认为这种情况不严重,因为大部分没丢,只丢了一小部分。
状态机:
三次握手:
建立连接的过程:
为什么是三次而不是两次。A通知完B,B通知完A还不够吗?
——其实B通知完A后B并不知道A能不能收到它发的消息。所以还得需要A回复一下B,让B能够相信A确实能够收到B发的消息。
在建立连接的过程中,双方都要维护一个状态机。双方的状态变化时序图就像这样。
Mss: 最大段
四次挥手:
取消连接:
A说分手吧,B说我知道了。(但B还没同意呢,A还要等B同意)
B说我同意,咱分手吧。A回答说好的。(B还需要收到A的消息才能确认A收到了B发的消息。如果B没有收到A发的确认消息,B会再发一遍。所以A会再等一会确认B收到了A的确认消息。过了一会两人都不再发消息了,连接就真的断了。)
还有一种异常情况就是,B最后一直没有收到ACK包,于是B还在不断地重发FIN包,这个时候A再收到包以后就表示,我已经在这里等了这么长时间,算是仁至义尽了,之后地我就都不认了,于是就直接发送RST,B就知道A早就跑了。
MSL是Maximum Segment Lifetime,报文最大生存时间,任何保温在网络上存在的最长时间,超过将被丢弃。TCP报文是基于IP协议的,而IP头种有一个TTL域,是IP数据包可以经过的最大路由书,没经过一个处理它的路由器此值就减1,当辞职位0则数据包将被丢弃,通识发送ICMP报文通知源主机。协议规定MSL位2分钟,实际应用中常用的是30秒,1分钟和2分钟等。