UDP、TCP协议段格式

1.长短链接

1.1为什么需要长链接

短链接:一次链接只可以发送一次请求,和进行一次响应

长链接:建立一次链接,释放一次,可以进行多次请求和响应

在早期HTTP协议之中,只有短链接的方式,因为那时候需要传输的资源内容不多,比较简单,比如常见的网页。现在一张网页动不动就是几十上百长图片外加一大堆的文件内容,这些内容不可能一次性全部传输完毕,是需要分批进行传输的。

链接本身是有成本的,具体体现在空间和时间方面。
如果是短链接,则需要多次链接和断开连接过程(三次握手、四次挥手),如此一来就比较浪费资源。
如果使用长链接,则只需要建立一次链接,断开一次链接,极大程度的减少了建立链接的消耗,提高了数据传输的效率

1.2如何确定长短链接

image-20210603211440713

1.3怎么区分多个请求

image-20210603211823436

2.UDP协议

2.1协议格式

image-20210604110113581

image-20210603220222741

2.2UDP的特点

1.无连接:知道对端的 IP和端口号就直接进行传输,不需要建立链接,至于对方是否收到消息,UDP不管

2.不可靠:没有确认和重传机制,如果发生丢包,数据无法到达对方,UDP协议也不会给应用层返回任何错误消息

3.面向数据包:不能够灵活的控制读写数据的次数和数据,每次读取数据要么一次性读完,要么不读

扩展:
1.为什么会有可靠性问题
网络传输,线路更长,干扰越多

2.不可靠在那些情况?
丢包、乱序、接收缓冲区满了(丢包)

2.3UDP的缓冲区

1.UDP没有真正意义上的发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议,进行后续的传输动作

2.UDP具有接收缓冲区,但是这个接受缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序是一致的(顺序也是可靠性的一种),如果缓冲区满了,在到达的UDP数据就会丢失(丢失了不会再重复发送)

3.UDP的socket即能读也能写,是全双工的

2.4UDP使用注意事项

UDP协议首部中有一个16位的最大长度,即一个UDP能够传输的数据最大长度是64K

如果传输的数据超过64k,就需要在应用层手动分包,进行多次发送,在接收端手动进行拼装

2.5基于UDP的上层协议

NFS:网络文件系统 (在局域网中进行文件的传输协议)

TFTP:简单文件传输协议

DHCP:动态主机配置协议

工作在网络层的路由器就是基于这个协议的,比如:
断网再进行链接,路由器会从本地局域网中选取一个未使用过的ip来进行分配(每次都不一样,动态分配的)

BOOTP:启动协议(用于无盘设备启动)

DNS:域名解析协议

也包括写UDP程序时,自己定义应用层协议

3.TCP协议

3.1确认应答机制

image-20210604094019257
需要注意的是,并不是一个请求(request),一个response
上层是不关心底层的通信细节的 -> 应用层的数据并不是直接发送到网络之中,而是写入到内核的缓冲区之中。tcp是面向字节流的,每次从缓冲区发送的并不一定是一个完整的请求,也并不一定只有一个请求. ACK应答的是从缓冲区读取的那一次内容

3.2超时重传机制

image-20210604095000420
每次时间设置长一点的原因是:发送多次数据都丢包,可能是当前的网络状态非常的拥挤,因此就多等一等再去发送

3.3TCP协议段格式

image-20210604084145634

1.源/目的端口:
表示数据是从哪个进程来,到哪个进程去

2.序列号:

是指发送数据的位置,每发送一次数据,就累加一次该数据字节数的大小。
序列号不会从0开始,而是在建立链接时,由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。

image-20210604085113549

3.确认应答号:

确认应答号字段长度32位。是指下一次应该收到的数据的序列号。实际上,它是指已收到确认应答号减
一为止的数据。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。

image-20210604085735867

引申问题:

1.为什么需要序号?

a.发送序号:是为了解决乱序问题,保证数据的可靠性
b.确认序号:通过回应的ACK确定是否丢包,ACK+确认序号确定丢了那个包

2.为什么需要两套序号?

TCP是全双工的,在数据通信的时候,扮演的角色有可能有不同,因此需要两套序号

4.选项:

表示报头的浮动大小,最多是40,即报头的最大值为 20 +40 =60字节 MSS:最大报文长度

5.首部长度(数据偏移):

4位TCP首部长度:表示该TCP头部有多少个32位bit(有多少个四字节);所以TCP头部的最大长度是 15*4=60

首部长度最少为5,即表示的TCP报头为4*5=20字节

报头和数据的分离:

直接先读取20字节,再根据首部长度算出报头总长度,然后将报头全部读完,得到的就是数据的起始位置。

将数据向上交付:

通过端口号找到对应的进程
TCP之中没有对应的数据长度,因为TCP是面向字节流的,主需要将数据按顺序放在缓冲区内即可,具体怎么读取,是由上层协议决定的
报文的完整性,由校验和来处理

6.标志位(控制位):

作用:通过标志位来区分是链接请求,还是通信请求(比如饭店通过衣服,区分是来吃饭的,还是来送外卖的)
当他们对应位置为1时,作用如下

SYN:用于建立链接,SYN设置为1,表示希望与对方建立链接

FIN:断开连接

ACK:确人应答,表示确认的字段变为有效

PSH:尽快交付,催促接收方尽快清空缓冲区,将数据交给上层协议,当PSH设置为0时,表示先将数据进行缓存

RST:image-20210604104659748

URG:表示包中有紧急的数据需要处理,对于紧急处理的数据,会在后面的紧急指针之中进行解释

7.窗口大小:

image-20210604105951247

表示接收缓冲区中,剩余容量的大小(满了就不要再发了),填写的是自己的缓冲区剩余容量

双方根据对方缓冲区的大小来决定发送数据的大小,这就叫做流量控制 ,是发送方通过在自己的TCP报头中填写窗口大小来进行控制的

8.紧急指针:

紧急指针又叫做带外数据

TCP是保证数据按照顺序处理的,当有一些数据需要特殊处理,就需要URG进行设置,表示有紧急数据需要进行处理,同时通过紧急指针突破原来的有序处理规则,进行插队式的处理数据

从数据部分的首位到紧急指针所值位置为紧急数据,也可以说紧急指针指出了紧急数据的末尾在报文段中的位置,并且只可以指定一个字节(“插队”是个别现象)

9.校验和:

校验报文是否正确

比如检验 ACK 7 8 9 , 如果9号检验正确,则表示前面的7 8 已经收到了

3.4原码

image-20210604105625969

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值