网络编程基础

一、OSI参考模型

OSI(Open System Interconnection)开放互联网参考模型最早提出的解决网络通信的标准协议。
OSI网络分层: 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层

1.1物理层

是OSI得最底层,主要是传输原始的比特流(bits),交换机,光纤等,主要是为数据端设备提供传送数据的通道及传输数据。

1.2数据链路层

数据链路层是实现计算机网络相邻节点之间的可靠传输,把原始的,有差错的传输线路上添加数据链路层协议以后,构成逻辑上可靠的数据链路**(主要是链路管理、差错控制、流量传输)**

1.3网络层

网络层源主机节点目的主机节点之间的可靠传输(IP) (可以找到目的地的的那台电脑)
( 路由选择,网络寻址,流量控制,拥塞控制,网路互联)

1.4传输层

传输层起着承上启下的作用,是源端点目的端点之前的可靠信息传输(port) (解析出对应电脑的哪个应用)

1.5会话层

负责应用程序的之间的会话建立,维护和中断

1.6表示层

提供传输数据的格式信息定义,主要提供的信息转换为能够共同理解的信息,提供的数据格式,控制信息格式,加密等的统一处理
包装关键信息:发送者、接收方、发送时间、消息类型:文字、表情表、语音、视频、文件

1.7应用层

为应用程序提供服务

二、TCP/IP协议族

2.1网络接口层

TCP/IP协议族中的网络接口层相当于OSI模型中的物理层和数据链路层

2.2网络互连层

相当于OSI中的网络层,把上层提交的信息分组发送到目标网络或注解。

2.3传输层

相当于OSI中的传输层,TCP负责在应用之间建立端到端的连接和可靠通信(port),UDP协议提供了无连接服务,不可靠的通信。

2.4应用层

相当于OSI中会话层,表示层,应用层,为网络中的各种网络提供服务

三、各层所涉及的协议

3.1链路层

协议:ARP和RARP
ARP:地址解析协议,实现IP地址转换为Mac物理地址信息(网卡)(收消息)
RARP反向地址解析协议:实现网卡地址信息转化为IP信息(发消息)

3.2网络层

IP(Internet Protocol)网络互连协议(Ipv4/IPv6)

报头

在这里插入图片描述
版本号:占4位,指IP协议的版本,有IPv4和IPv6两种,对于IPv4协议该字段就是4
首部长度: 占4位,指IP协议的报头长度,范围在20-60字节
区分服务: 占8位,只有在使用区分服务时该字段才有作用,一般情况下不使用该字段
长度: 占16位,指IP协议的总长度:报头长度+数据长度
根据IP报头来看,长度占16位,长度应该在65535个字节,但实际传送不了这么大长度的IP报文;IP报文的长度是依据下层数据链路层规定的数据帧中的数据字段的最大长度,称为最大传输单元MTU;一般最大传输单元MTU的长度为1500个字节,所以IP报文最大长度1500个字节,若超过该长度,IP报文会被分片。16位标识、3位标志、13位片偏移用于IP报文的分片和组装
标识: 占16位,由于IP报文有长度的限制,超过MTU会被分片,而在交付给上层时需要将IP报文组装,该字段用于唯一标识一个IP报文
标志: 占3位,第一位为保留位,第二位表示该IP报文是否分片(1表示禁止分片,0表示分片),第三位表示该IP报文是否为最后一个
片偏移: 占13位,在报文分片时有效,表示该片报文应位于整个IP报文的那个位置
生存时间TTL: 占8位,在路由时通过一跳与多跳的方式查找路径,为防止某个报文在网络中一直处于游离状态,无限循环,所以在报头中规定了报文在网络中最多经过路由器的数量,也就是该报文的最大跳数
协议类型: 占8位,表示该IP报文要交给上层的那个协议(UDP或TCP)
首部校验和: 占16位,鉴别头部是否有损坏
源IP: 占32位,表示该IP报文从哪里来
目的IP: 占32位,表示该IP报文要发送到哪里

数据报的分片举例
在这里插入图片描述

IP地址的表现形式及划分

表现形式
点分十进制:数据分4组,每一组范围是[0~255],如255.255.255.255
二进制: 每一组8位,如:11111111 11111111 11111111 11111111
在这里插入图片描述
地址划分
IP 地址由网络主机两部分标识组成
网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。 而相同段内相连的主机必须有相同的网络地址。IP地址的主机标识 则不允许在同一个网段内重复出现。 由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的 IP 地址都不会相互重叠。即 IP 地址具有了唯一性。
总结:不同的网段其值是不能重复的,在不同的网段中主机是可以重复的,同一个网段中主机不能重复。
IP主机标识
IP 包被转发到途中某个路由器时,正是利用目标 IP 地址的网络标识进行路由。因为即使不看主机标识,只要一见到网络标识就能判断出是否为该网段内的主机。

IP地址分级

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

A 类 IP 地址是首位以 “0” 开头的地址。 00000000~01111111
从第 1 位到第 8 位是它的网络标识。用十进制表示的话,0.0.0.0~127.0.0.0 是 A 类的网络地址。A 类地址的后 24 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为16,777,214个。

B 类 IP 地址是前两位 “10” 的地址。 10000000 00000000 ~10111111 11111111
从第 1 位到第 16 位是它的网络标识。用十进制表示的话,128.0.0.0~191.255.0.0 是 B 类的网络地址。B 类地址的后 16 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为65,534个。

C 类 IP 地址是前三位为 “110” 的地址。
从第 1 位到第 24 位是它的网络标识。用十进制表示的话,192.0.0.0~223.255.255.0 是 C 类的网络地址。C 类地址的后 8 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为254个。

D 类 IP 地址是前四位为 “1110” 的地址。
从第 1 位到第 32 位是它的网络标识。用十进制表示的话,224.0.0.0~239.255.255.255 是 D 类的网络地址。D 类地址没有主机标识,常用于多播。
子网掩码
子网掩码用二进制方式表示的话,也是一个 32 位的数字。它对应 IP 地址网络标识部分的位全部为 “1”,对应 IP 地址主机标识的部分则全部为 “0”。由此,一个 IP 地址可以不再受限于自己的类别,而是可以用这样的子网掩码自由地定位自己的网络标识长度。当然,子网掩码必须是 IP 地址的首位开始连续的 “1”。
子网掩码的两种表示方式:
第一种 :将 IP 地址与子网掩码的地址分别用两行来表示。
以 172.20.100.52 的前 26 位是网络地址的情况为例,如下:
IP 地址 172. 20. 100. 52
子网掩码 255. 255. 255. 192
网络地址 172. 20. 100. 0

第二种:在每个 IP 地址后面追加网络地址的位数用 “/ ” 隔开,
IP 地址 172. 20. 100. 52 / 26
网络地址 172. 20. 100. 0 / 26
在第二种方式下记述网络地址时可以省略后面的 “0” 。
例如172.20.0.0/26 跟 172.20/26 其实是一个意思。

路由控制

发送数据包时所使用的地址是网络层的地址,即 IP 地址。然而仅仅有 IP 地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。保存这种信息的就是路由控制表。

该路由控制表的形成方式有两种:
静态路由控制:管理员手动设置
动态路由设置: 路由器与其他路由器相互交换信息时自动刷新

IP 协议始终认为路由表是正确的。然后,IP 本身并没有定义制作路由控制表的协议。即 IP 没有制作路由控制表的机制。该表示由一个叫做“路由协议”的协议制作而成

IP地址与路由控制

IP 地址的网络地址部分用于进行路由控制。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。
在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址。

IPV6

IPv6(IP version 6)是为了根本解决 IPv4 地址耗尽的问题而被标准化的网际协议。
IPv4 的地址长度为 4 个 8 位字节,即 32 比特。
而 IPv6 的地址长度则是原来的 4 倍,即 128 比特,一般写成 8 个 16 位字节。

特点

  • IP 得知的扩大与路由控制表的聚合。
  • 性能提升:包首部长度采用固定的值(40字节),不再采用首部检验码。简化首部结构,减轻路由器负担。路由器不再做分片处理。
  • 支持即插即用功能。即使没有DHCP服务器也可以实现自动分配 IP 地址。
  • 采用认证与加密功能。应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能。
  • 多播、Mobile IP 成为扩展功能。
域名DNS

DNS:将域名解析为IP地址
一个域名有多个层次组成,从上层到下层分为顶级域名、二级域名、三级域名以及四级域名。所有域名可以化成一颗域名树。
mail.ccyv.com从左往右依次是:三级域名、二级域名、顶级域名。
域名解析过程
主机箱本地域名服务器解析的过程采用递归,而本地域名服务器向其他域名服务器解析可以使用递归和迭代两种方式
迭代方式:本地域名服务器向一个域名服务器解析请求之后,结果返回到本地域名服务器,然后本地域名服务器继续向其他域名服务器请求解析(向上一次返回一次)
递归方式:请求的结果不是直接返回,而是继续向前请求解析,最后的结果才会返回(一直向上找)

面试题

从输入网址到获得页面的网络请求的过程?
域名解析:其实就是根据用户输入的网址去寻找它对应的IP地址,比如输入www.baidu.com的网址就会经历以下过程
(类似于迭代的过程)

1.先从浏览器缓存里找IP,因为浏览器会缓存DNS记录一段时间
2.如没找到,再从Hosts文件查找是否有该域名和对应IP
3.如没找到,再从路由器缓存找
4.如没找到,再从DNS缓存查找
5.如果都没找到,浏览器域名服务器向根域名服务器(baidu.com)查找域名对应IP,还没找到就把请求转发到下一级,直到找到IP
整个过程: 划分为URL解析、网络传输通信、页面渲染
URL解析
名词解释:
URL :(Uniform Resource Locator)统一资源定位符,用于互联网上不同资源的标示。
http(协议)😕/baidu.com(域名):80(端口)
1:浏览器本地解析URL(一般是做格式化检查以及确认用http还是https协议,默认是http协议)。
2:浏览器本地缓存查找url对应ip。
3:本地host文件查找对应ip。
4:本地路由器dns查看对应ip。
若上面都查不到,则要请求到dns服务器查找ip。
1:服务商dns检查缓存是否存在对应ip。
2:若不存在缓存或者缓存过期 则到根域名服务商上查找对应ip。
3:根域名服务商也是先检查缓存,若无,则检查域名为哪个dns服务商负责解析。然后请求转发。获得域名对应ip。
最后:ip返回到本地服务商的dns,本地服务商dns更新缓存。客户端成功拿到ip。(至于为啥一定要拿到ip,因为我们的tcp/ip协议很任性的只能识别ip)

网络传输通信
1:客户端拿到ip地址后,想要进行通信,先要和对方取得联系。看对方在不在,这个通常是由三次握手来实现。
三次握手补充:客户端和服务器一共发送三个包,同步连接双方的序列号和确认号并交换 TCP) 建立tcp连接。与目标服务器建立短连接。
通俗的说就是这样:
客户端:在家么,想去你家看看你。
服务器:在呀,欢迎来玩啊。
客户端:马上到。
2:三次握手完成后,tcp和服务器之间就建立了一个可靠地虚拟通道。浏览器知道了这个消息后。就将http请求消息打包,通过tcp协议发送给了服务端。
3:服务端收到请求报文后,处理报文信息,处理完成后将数据打包返回给客户端啊。
4:通信完成后,通过四次挥手,拆除tcp连接。客户端或服务器均可主动发起挥手动作。
5:最后,客户端拿到返回数据。
页面渲染
1:浏览器会将返回的HTML通过深度遍历解析成一个DOM树。
2:将CSS解析成 CSS Rule Tree 。
3:根据DOM树和CSSOM来构造 Rendering Tree。
补充(CSSOM是一个建立在web页面上的 CSS 样式的映射,它和DOM类似,但是只针对CSS而不是HTML)
4:最后通过Rendering Tree,浏览器就可以知道每个节点和各节点css的关系,再算出每个节点在屏幕的位置就可以绘制出每个节点了。
上述渲染过程为从上而下,逐步完成。即浏览器绘制了一部分就会显示一部分出来,再继续计算下面的部分。

3.3传输层

协议:TCP、UDP

3.3.1TCP

TCP(Transmission Control Protocol)传输控制协议,是面向连接的传输层协议。采用字节流传输数据。

TCP协议的特点
  • 面向连接:通信之前必须建立连接
  • 每一条TCP连接只能是点对点即一对一的
  • 提供可靠的交付服务,通过TCP连接传输的数据,无差错、不丢失、不重复。
  • 提供全双工通信(双向通信)
  • 面向字节流。
  • TCP首部占20个字节
    TCP报文
    在这里插入图片描述

4位的数据偏移
以32位(4字节)字长为单位,需要这个值是因为任选字段的长度是可变的。以4字节为单位是一个字长。2^4=15即最大是60个字节。不存在任选字段正常的报头长度是20字节。其实相当于给出数据在数据段中的开始位置。

保留位
6位,必须为0

标志位
占有6个比特位,他们中可以有多个为置为1,依次为:URG,ACK,PSH,RST,SYN,FIN。
下面具体分析:

URG:该位为1说明表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并督促上层应用敢快处理这些数据。
ACK:确认号有效
PSH:接收方应尽快将这个报文交给应用层,叫做push。所谓push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队。
RST:连接复位,复位因主机奔溃或其他原因而出现的错误连接,也可以用于拒绝非法的分段或拒绝连接请求,这个用处还是比较多的
SYN:是一个同步序号,通常与ACK合用用来建立连接。也就是常说的三次握手
FIN:既然有建立连接那么必然有拆除连接,这个字段表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。
URG和PSH都是紧急时使用,那么这两个有什么关系和区别呢?
答:在一般的数据中都会存在PSH,而URG只有在紧急情况下才会触发TCP报文中的紧急指针字段,紧急方式是向对方发送紧急数据的一种方式,表示数据需要优先处理。它是一个正的偏移,与TCP首部中序号字段的值相加表示紧急数据后面的字节,紧急指针是数据最后一个字节,TCP首部中只有紧急指针指出紧急数据的位置,它所指的字节为紧急数据,但没有办法指定紧急数据的长度。

紧急指针
只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。

窗口大小
TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。这是一个16 bit字段,因而窗口大小最大为65535字节。
校验和
用于传输层差错校验。它校验数据段头部和数据部之和。如果数据长度为奇数字节时,则要附加填充1个为0的字节,将数据段变为16位的整数倍。校验和算法比较简单,它将所有16位字节以补码形式相加,然后再对相加和取补。因此,接收方对包括校验和在内的字段进行补码相加运算时,如果正确接收,其结果为0。
比如,除校验和字段外,数据段为1101,0011。将它们取“1”的补码,分别为1111-1101=0010,1111-0011=1100,补码相加为0010+1100=1110,再取补1111-1110=0001,因此校验和取0001。接收方收到1101,0011,0001后进行校验时,将它们补码相加0010+1100+1110=0,说明正确接收。

三次握手

在这里插入图片描述
第一次握手:客户机发送连接请求报文段到服务器,并进入SYN_SENT状态,等待服务器确认
(SYN = 1,seq=x)

第二次握手:服务器收到连接请求报文,如果同意连接,向客户机发回确认报文段,并为该TCP连接分配TCP缓存和变量
(SYN=1,ACK=1,seq=y,ack=x+1)。

第三次握手:客户机收到服务器的确认报文段后,向服务器给出确认报文段,并且也要给该连接分配缓存和变量。此包发送完毕,客户端进入ESTABLISHED,然后TCP连接成功,完成三次握手
(ACK=1,seq=x+1,ack=y+1)

四次挥手

在这里插入图片描述
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。
收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

  • TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送
  • 服务器收到这个FIN,发送一个ACK,确认序号为收到的序号+1,和SYN一样,一个FIN将占用一个序号。
  • 服务器关闭客户端的连接,发送一个FIN给客户端
  • 客户端发回ACK报文确认,并将确认序号设置为收到的序号+1。
有关面试题
1.为什么三次握手在关闭的时候需要四次挥手?

首先当Server端收到Client端的SYN连接请求后可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。在关闭连接时,当Server端收到FIN报文时,很可能不会立即关闭SOCKET,所以只能先回复一个ACK报文告知Client端已经收到FIN报文,只有等Server端的所有报文都发送完成,才能发送FIN报文。所以需要四次挥手。

2.为什么TIME_WAIT状态需要经过2MSL
(最大报文生存时间)才能返回到CLOSE状态?

假如网络是不可靠的,那么最后一个ACK有可能丢失,所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发出最后的ACK回复,Server端可能并没有接收到该ACK,将会不断重复的发送FIN片段,所以Client不能立即关闭。它必须确认Server端已经接收到了ACK。所以在Client发送ACK以后会进入到TIME_WAIT状态,如果在这个时间段内,Client没有重复接收到FIN报文,那么Client推断Server端已经成功接收ACK,故TCP断开连接。

3.为什么不能用两次握手进行连接?

三次握手完成了两个重要的功能,既要求双方都做好发送数据的准备,也要允许双方就初始序列号进行协商。该序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

4.如果已经建立了连接,但是客户端突然出现故障怎么办?

答:TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

TCP如何发送数据

TCP发送数据
因为TCP本身传输的数据包大小有限制,所以当应用发出的消息包过大,TCP会把应用消息包拆分为多个TCP数据包发送出去。当应用发送出去的消息太小时,TCP为了减少网络请求次数的开销,它会等待多个消息包一起打成一个TCP数据包发送过去。
TCP接收数据
因为TCP缓冲区里的数据都时字节流形式,没有明确的边界,所以应用从TCP缓冲区中读取数据时就没办法指定一个或几个消息一起读,只能选择一次读取多大的数据流,而这个数据流中可能包含着某个消息包的一部分数据。

滑动窗口协议

滑动窗口协议(Sliding Window Protocol),属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量。
滑动窗口的本质: 描述发送方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。如果发送方收到接收方的窗口的大小为0的TCP数据报,那么发送方将停止发送数据,等到接收方发送窗口大小不为0的数据包的到来

在这里插入图片描述
滑动窗口的作用:(A与B建立TCP连接)
1.B端来不及处理接收数据(控制不同的速率的主机间同步)这时,A通过B端通知的接收窗口而减缓数据的发送。
2.B端来得及处理接收数据,但是在A与B之间某处加C,使得AB之间的整体带宽性能较差,此时,A端根据拥塞处理策略(慢启动,加倍递减和缓慢增加)来更新窗口,已决定数据的发送。
流量控制
主要是接收方传递信息给发送方,使其不要发送数据太快,是一种端到端的控制。主要的方式就是返回的ACK中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。
在这里插入图片描述
这里面涉及到一种情况,如果B已经告诉A自己的缓冲区已满,于是A停止发送数据;等待一段时间后,B的缓冲区出现了富余,于是给A发送报文告诉A我的rwnd大小为400,但是这个报文不幸丢失了,于是就出现A等待B的通知||B等待A发送数据的死锁状态。为了处理这种问题,TCP引入了持续计时器(Persistence timer),当A收到对方的零窗口通知时,就启用该计时器,时间到则发送一个1字节的探测报文,对方会在此时回应自身的接收窗口大小,如果结果仍未0,则重设持续计时器,继续等待。

TCP滑动窗口技术通过动态改变窗口大小来调节两台主机间数据传输。每个TCP/IP主机支持全双工数据传输,**因此TCP有两个滑动窗口:一个用于接收数据,另一个用于发送数据。**TCP使用肯定确认技术,其确认号指的是下一个所期待的字节。假定发送方设备以每一次三个数据包的方式发送数据,也就是说,窗口大小为3。发送方发送序列号为1、2、3的三个数据包,接收方设备成功接收数据包,用序列号4确认。发送方设备收到确认,继续以窗口大小3发送数据。当接收方设备要求降低或者增大网络流量时,可以对窗口大小进行减小或者增加,本例降低窗口大小为2,每一次发送两个数据包。当接收方设备要求窗口大小为0,表明接收方已经接收了全部数据,或者接收方应用程序没有时间读取数据,要求暂停发送。发送方接收到携带窗口号为0的确认,停止这一方向的数据传输。

拥塞控制

拥塞控制就是防止过多的数据注入到网络中,可以使得网络中的路由器或链路不致过载。
1.慢开始、拥塞控制
2.快重传、快恢复
慢开始

  • 发送方维持一个叫做“拥塞窗口”的变量,该变量和接收端口共同决定了发送者的发送窗口。
  • 当主机开始发送数据时,避免一下子将大量字节注入到网络中,造成或者增加拥塞,选择发送一个1字节的试探报文。
  • 当收到第一个字节的数据的确认后,就发送两个字节的报文。
  • 若再次收到两个字节的确认报文后,就发送四个字节的报文。依次以2的指数次递增。
  • 最后会达到一个提前预设的:慢开始门限。即ssthresh。cwnd < ssthresh:继续使用慢开始算法;cwnd>ssthresh:停止使用慢开始算法,使用拥塞控制避免算法;cwnd=ssthresh:既可以使用慢开始算法也可以使用拥塞避免算法。
  • 所谓的拥塞避免算法就是没经过一个往返的时间RTT就把发送方的拥塞窗口+1,即拥塞窗口缓慢增大,按照线性规律增长。
  • 当出现网络拥塞,比如丢包时,将慢开始的门限设置为原先的一半,然后将cwnd设为1,执行慢开始算法(较低的起点,指数级的增长)

上述方法的目的是在拥塞发生时循序减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完毕。慢开始和拥塞控制算法常常作为一个整体使用,而快重传和快恢复则是为了减少因为拥塞导致的数据包丢失带来的重传时间,从而避免传递无用的数据到网络。

快重传机制
快重传/快恢复是为了减少因为拥塞阻塞导致的数据包丢失带来的重传时间,从而避免传递无用的数据到网络。

  • 接收方建立这样的机制,如果一个包丢失,则对后续的包继续发送针对该包的重传请求;
  • 一旦发送方接收到三个一样的确认,就知道该包之后出现了错误,立刻重传该包;
  • 此时发送方开始执行“快恢复”算法:

慢开始门限减半;
cwnd设为慢开始门限减半后的数值;
执行拥塞避免算法(高起点,线性增长);

TCP如何保证数据可靠性

1)校验和
2)序列号
3)确认应答机制
4)超时充实机制/快重传

3.3.2UDP

UDP(User Datagram Protocol)用户数据包协议发送数据前无需建立建立,不使用拥塞控制,不保证可靠传输,最大能力交付

UDP协议特点
  • 无连接
  • 尽最大努力交付
  • 面向报文
  • 无拥塞控制
  • 支持一对一、一对多、多对一和多对多的交互通信
  • 首部开销小(只有四个字段:源端口、目的端口、长度、校验和)
UDP报文

在这里插入图片描述 用户数据报UDP有两个字段:数据字段和首部字段。首部很简单,只有8个字节。由四个字段组成,每个字段长度都是两个字节。各字段意义如下:
1) 源端口 :在需要对方回信时选用。不需要时可用全0。
2) 目的端口 : 在终点交付报文时必须使用到。
3) 长度 :UDP用户数据报的长度,其最小值为8(仅包含首部)。
4)检验和 :检验UDP用户数据报在传输中是否有错,有错就丢弃。
UDP包的理论长度
udp的最大包长度是2^16-1的个字节。由于udp包头占8个字节,而在ip层进行封装后的ip包头占去20字节,所以这个是udp数据包的最大理论长度是2 ^16-1-8-20=65507。
然而这个只是udp数据包的最大理论长度。首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层、网络层、运输层、应用层。UDP属于运输层,在传输过程中,udp包的整体是作为下层协议的数据字段进行传输的,它的长度大小受到下层ip层和数据链路层协议的制约。
MTU相关概念
以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的。这个1500字节被称为链路层的MTU(最大传输单元)。因特网协议允许IP分片,这样就可以将数据包分成足够小的片段以通过那些最大传输单元小于该数据包原始大小的链路了。这一分片过程发生在网络层,它使用的是将分组发送到链路上的网络接口的最大传输单元的值。这个最大传输单元的值就是MTU(Maximum Transmission Unit)。它是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。
在这里插入图片描述

Socket通信
Socket即套接字,两个主机之间逻辑连接的端点
Socket编程是一种C/S模式的编程,即客户端和服务端
在服务端创建一个服务器套接字(ServerSocket),并把它附在一个端口上,服务器从这个端口监听连接
端口号:端口号的范围是0到65536,但是0到1024是为特权服务保留的端口号,我们可以选择任意一个当前没有被其他进程使用的端口。
客户端请求与服务器进行连接的时候,根据服务器的域名或者IP地址,加上端口号,打开一个套接字。当服务器接受连接后,服务器和客户端之间的通信就像输入输出流一样进行操作。

3.3.3 TCP和UDP的区别

TCP:面向连接、可靠的、流式服务
UDP:无连接、不可靠的、数据包服务

在这里插入图片描述
在这里插入图片描述

3.4应用层

协议:FTP、SMTP、HTTP
FTP(File Transfer Protocol) 文件传输协议<端口号21> 减少或消除不同操作系统下文件处理的不兼容性
SMTP(Simple Mail Transfer Protocol)简单邮件传输协议 <端口25> 用来发送邮件的
HTTP(Hypertext Transfer Protocol)超文本传输协议<端口号 80>,主要是web浏览器和服务端交互使用的协议

3.5用来表示数据的单位

  • 包:全能性术语
  • 帧:数据链路层中的包的单位
  • 数据包:IP和UDP等网络层以上的层中包的单位
  • 段:TCP数据流中的信息
  • 消息:应用协议中数据的单位
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值