网络编程基础回顾

计算机网络(5):运输层

OSI 模型与 TCP/IP 协议

在这里插入图片描述

OSI七层协议模型 (open system interconnection)

  • 应用层:为应用数据提供服务
  • 表示层:数据格式转化,数据加密
  • 会话层:建立、维护和管理会话
  • 传输层:建立、维护和管理端到端的链接,控制数据传输的方式
  • 网络层:数据传输线路选择,IP地址及路由选择
  • 数据链路层:物理通路的发送和数据包的划分,附加Mac地址到数据包
  • 物理层:01比特流的转换

数据传输由顶向下,下层为上层提供服务

TCP/IP四层协议模型

  • 应用层:负责处理特定的应用程序细节,如ftp,http ,smtp,ssh 等;
  • 运输层:主要为两台主机上的应用提供端到端的通信,如TCP,UDP。
  • 网络层(互联网层):处理分组在网络中的活动,比如分组的选路。
  • 链路层(数据链路层/网络接口层):包括操作系统中的设备驱动程序、计算机中对应的网络接口卡,01比特流的转换

协议封装

下层协议通过封装为上层协议提供服务
应用程序数据在发送到物理网络上之前,将沿着协议栈从上往下依次传递。每层协议都将在上层数据的基础上加上自己的头部信息(有时也包括尾部信息),以实现该层的功能。
在这里插入图片描述

TCP 协议头部

在这里插入图片描述

  • 源端口号和目的端口号:再加上IP首部的源IP地址和目的IP地址可以唯一确定一个TCP连接
  • 数据序号:表示在这个报文段中的第一个数据字节序号
  • 确认序号:仅当ACK标志为1时有效。确认号表示期望收到的下一个字节的序号
  • 偏移:就是头部长度,有4位,跟 IP 头部一样,以4字节为单位。最大是60个字节
  • 保留位:6位,必须为0
  • 6个标志位:
    URG-紧急指针有效;
    ACK-确认序号有效;
    PSH-接收方应尽快将这个报文交给应用层;
    RST-连接重置;
    SYN-同步序号用来发起一个连接;
    FIN-终止一个连接;
  • 窗口字段:16位,代表的是窗口的字节容量,也就是TCP的标准窗口最大为2^16 - 1 = 65535个字节;
  • 校验和:源机器基于数据内容计算一个数值,收信息机要与源机器数值结果完全一样,从而证明数据的有效性。检验和覆盖了整个的TCP报文段:这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证的;
  • 紧急指针:是一个正偏移量,与序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式;
  • 选项与填充(必须为4字节整数倍,不够补0):最常见的可选字段的最长报文大小 MSS(Maximum Segment Size),每个连接方通常都在一个报文段中指明这个选项。它指明本端所能接收的最大长度的报文段。
    该选项如果不设置,默认为 536(20+20+536=576字节的IP数据报)

三次握手

在这里插入图片描述
1.客户端向服务器发送 SYN:
客户端发起连接请求,发送一个TCP报文段,其中包含SYN(同步)标志,并选择一个初始序列号Seq=X(X一般为1)。随后客户端进入SYN-SENT 阶段。
这个报文段不包含数据,但在TCP首部中有SYN标志位。
2.服务器收到SYN并发送ACK + SYN:
服务器收到客户端的SYN后,结束 LISTEN 阶段,回应一个确认(ACK)标志,确认收到了客户端的请求,同时也发送一个SYN标志。
服务器选择一个自己的初始序列号(Seq=y)。随后服务器端进入SYN-RCVD 阶段。
3.客户端收到ACK + SYN:
客户端收到服务器的确认和SYN后,结束 SYN-SENT 阶段,回应一个ACK标志(Ack=y+1),确认收到服务器的响应。随后客户端进入ESTABLISHED阶段。
从此时开始,数据传输的双向连接建立完成,可以开始进行数据传输。

在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成。

滑动窗口

维持发送方/接收方缓冲区,缓冲区是用来解决网络之间数据不可靠的问题,例如丢包,重复包,出错,乱序。在TCP协议中,发送方和接受方通过各自维护自己的缓冲区。通过商定包的重传机制等一系列操作,来解决不可靠的问题。

正常情况:
在这里插入图片描述

在这里插入图片描述
4号包对方已经被接收到,所以被涂成了灰色。“窗口”就往右移一格,这里只要保证“窗口”是7格的。 我们就把11号包读进了我们的缓存。进入了“待发送”的状态。8、9号包已经变成了黄色,表示已经发送出去了。接下来的操作就是一样的了,确认包后,窗口往后移继续将未发送的包读进缓存,把“待发送“状态的包变为”已发送“。

丢包情况:
在这里插入图片描述
有可能我们包发过去,对方的Ack丢了。也有可能我们的包并没有发送过去。从发送方角度看就是我们没有收到Ack。

一般情况:一直在等Ack。如果一直等不到的话,我们也会把读进缓存的待发送的包也一起发过去。但是,这个时候我们的窗口已经发满了。所以并不能把12号包读进来,而是始终在等待5号包的Ack。

如果我们这个Ack始终不来怎么办呢? 采用超时重传机制解决:
发送端每发送一个报文段,就启动一个定时器并等待确认信息;接收端成功接收新数据后返回确认信息。若在定时器超时前数据未能被确认,TCP就认为报文段中的数据已丢失或损坏,需要对报文段中的数据重新组织和重传。(重传超时时间: RTO)
在这里插入图片描述

四次挥手

在这里插入图片描述

  1. 客户端发送断开 TCP 连接请求的报文,其中报文中包含 seq 序列号,是由发送端随机生成的,并且还将报文中的 FIN 字段置为1 ,表示需要断开TCP连接。(FIN=1,seq=u,u由客户端随机生成)
  2. 服务端会回复客户端发送的 TCP 断开请求报文,其包含 seq 序列号,是由回复端随机生成的,而且会产生 ACK 字段,ACK 字段数值是在客户端发过来的 seq 序列号基础上加 1进行回复,以便客户端收到信息时,知晓自己的 TCP 断开请求已经得到验证。(ACK=1,FIN=1,ack=u+1,seq=v,v由服务端随机生成)
  3. 服务端在回复完客户端的 TCP 断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦 确认传输数据完毕,就会将回复报文的 FIN 字段置1, 并且产生随机 seq 序列号。(ACK=1,FIN=1,ack=u+1,seq=w,w由服务端随机生成)
  4. 客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的 seq 字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,从而完成服务端请求的验证回复。(ACK=1,FIN=1,ack=w+1,seq=u+1)

分包和粘包

TCP分包
场景:发送方发送字符串”helloworld”,接收方却分别接收到了两个数据包:字符串”hello”和”world”。

发送端发送了数量较多的数据,接收端读取数据时候数据分批到达,造成一次发送多次读取;

造成分包的原因:
TCP是以段(Segment)为单位发送数据的,建立TCP链接后,有一个最大消息长度(MSS).如果应用层数据包超过MSS,就会把应用层数据包拆分,分成两个段来发送。这个时候接收端的应用层就要拼接这两个TCP包,才能正确处理数据。

相关的,路由器有一个MTU( 最大传输单元)一般是1500字节,除去IP头部20字节,留给TCP的就只有MTU-20字节。所以一般TCP的MSS为MTU-20=1460字节。

当应用层数据超过1460字节时,TCP会分多个数据包来发送。

TCP 粘包
场景:发送方发送字符串”hello“和“world”,接收方却接收到了一个字符串”helloworld”。

发送端发送了几次数据,接收端一次性读取了所有数据,造成多次发送一次读取;通常是网络流量优化,把多个小的数据段集满达到一定的数据量,从而减少网络链路中的传输次数

造成TCP粘包的原因:
TCP为了提高网络的利用率,会使用一个叫做Nagle的算法,该算法是指,发送端即使有要发送的数据,如果很少的话,会延迟发送。如果应用层给TCP传送数据很快的话,就会把两个应用层数据包“粘”在一起,TCP最后只发一个TCP数据包给接收端。

分包和粘包解决方案
发送数据前,给数据附加两字节的长度:

4字节N个字节
FBEB数据长度N数据内容
  1. 包标识: 包头部的特殊标识,用来标识包的开始
  2. 数据长度:数据包的大小,固定长度,2、4 或者8字节。
  3. 数据内容:数据内容,长度为数据头定义的长度大小。

a)发送端:先发送包表示和长度,再发送数据内容。
b)接收端:先解析本次数据包的大小N,再读取N个字节,这N个字节就是一个完整的数据内容。
在这里插入图片描述

UDP 通信

在使用UDP通讯时,不需要区分客户端和服务端,但在通讯过程中,我们可以将发送端定义为服务端,接收端定义为客户端。因此,在配置UDP通讯时,我们只需要开启本机端口即可。在发送数据时,需要设置接收的IP地址和端口。UDP模式下,任意一端都可以发送数据,只需要在发送端添加目标IP和端口即可。

UDP(用户数据报协议)是无连接的协议,每个UDP数据包都是独立的,没有连接状态的维护。服务器在接收UDP数据包时,不需要为每个客户端连接创建额外的进程或线程,因为它不必保持连接状态。每个数据包都包含足够的信息,服务器可以直接处理它们,而不必关心连接的保持

UDP通信,是不保证有序到达的数据报服务。(在局域网内,使用UDP已很可靠)

使用UDP通信与TCP通信使用上的区别:
1)创建套接字时的 type(参数2)不同。
TCP通信,使用SOCK_STREAM
UDP通信,使用SOCK_DGRAM

2)发送数据和接收数据时,使用的接口不同
TCP通信
发送数据,使用write(或send
接收数据,使用read(或recv
UDP通信
发送数据,使用sendto
接收数据,服务器端使用recvfrom 客户端使用recv

3)不需要使用listen
4)不需要先建立连接(TCP客户端和服务器端分别使用connectreceive建立连接)

UDP适用于那些对实时性要求高、能够容忍一定数据丢失的场景,因为它的无连接性和较低的开销使其更适合快速而简单的通信。在这样的场景下,服务器可以轻松地处理多个客户端的独立请求,而无需为每个连接创建额外的进程或线程。

。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2-6 任务 猜数小游戏(单次版)

本任务要求编写一个猜数小游戏(单次版),游戏规则是计算机产生一个0到100之间的随机整数,用户通过输入猜测的数字进行猜测,根据猜测情况给出提示,直到猜对为止。编程思路是利用while循环和多分支结构实现永真…

美特CRM upload.jsp 文件上传致RCE漏洞复现(CNVD-2023-06971)

0x01 产品简介 MetaCRM是一款智能平台化CRM软件,通过提升企业管理和协同办公,全面提高企业管理水平和运营效率,帮助企业实现卓越管理。美特软件开创性地在CRM领域中引入用户级产品平台MetaCRM V5/V6,多年来一直在持续地为客户创造价值,大幅提升了用户需求满足度与使用的满意…

静态分配IP,解决本地连接不上Linux虚拟机的问题

在Window环境下,使用远程终端工具连接不了VMware搭建的Linux虚拟机(CentOS 7),并且在命令行ping不通该Linux虚拟机的IP地址。下面通过配置网关解决本地与Linux虚拟机连接问题: 1 查看虚拟机网关地址 在VMware虚拟机上…

快速掌握Element-Ul,构建高效网页应用【AI写作】

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

竞赛课第十周(巴什游戏,尼姆博弈)

目录 目的: 实验内容: 第一题 思路: 【参考代码】 【运行结果】 第二题 输入: 输出: 【参考代码】 【运行结果】 目的: 熟悉并掌握公平组合游戏 (1)巴什游戏、尼姆游戏 (2)图游戏…

【源码+文档+调试教程】基于微信小程序的电子购物系统的设计与实现

摘 要 由于APP软件在开发以及运营上面所需成本较高,而用户手机需要安装各种APP软件,因此占用用户过多的手机存储空间,导致用户手机运行缓慢,体验度比较差,进而导致用户会卸载非必要的APP,倒逼管理者必须改…

【数据结构与算法】力扣 226. 翻转二叉树

题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入: root [4,2,7,1,3,6,9] 输出: [4,7,2,9,6,3,1]示例 2: 输入: root [2,1,3] 输出: [2,3,1…

应聘项目经理,软考证书会是一个加分项吗?

加分项是必需的,特别是IT行业的项目经理职位。您可以在各大招聘网站上搜索项目经理职位,前景好、薪资高、待遇好的项目经理岗位,基本上都有证书的要求。非IT行业项目经理,可以考虑PMP证书或者其他与专业相关的证书,比如…

低压MOS在多电平逆变器上的应用-REASUNOS瑞森半导体

一、前言 多电平逆变器,是一种新型逆变器。常规逆变器,在单桥臂上采用单个开关器件。多电平逆变器在单桥臂上包含多个串联开关器件,能够精细地控制输出电压。将逆变输出的正弦波进行微分,微分数量越多,越接近正弦波。…

C++ 多态(一)

一、多态定义 同一种操作作用于不同的对象时,可以产生不同的行为。在面向对象编程中,多态性是指通过继承和重写实现的,同一个方法在不同的子类中可以表现出不同的行为。多态性可以提高代码的灵活性和可扩展性,使得程序更易于维护…

Garden Planner for Mac v3.8.62注册激活版:园林绿化设计软件

Garden Planner for Mac是一款专为苹果Mac OS平台设计的园林景观设计软件。这款软件的主要功能是帮助用户设计梦想中的花园,包括安排植物、树木、建筑物和其他物体。 Garden Planner for Mac提供了一个包含1200多种植物和物体符号的库,这些符号都可以进行…

使用QLoRA在自定义数据集上finetuning 大模型 LLAMA3 的数据比对分析

概述: 大型语言模型(LLM)展示了先进的功能和复杂的解决方案,使自然语言处理领域发生了革命性的变化。这些模型经过广泛的文本数据集训练,在文本生成、翻译、摘要和问答等任务中表现出色。尽管LLM具有强大的功能,但它可能并不总是与特定的任务或领域保持一致。 什么是LL…

IO 多路复用 来了(最详细版)

IO多路转接select //为什么要写多进程/多线程的并发服务器? 在进行套接字通信的时候有一些阻塞函数:accept,read、recv,write、send 需要不停的检测客户端链接,需要不停的调用accept,需要占用一个线程或…

VULNCON CTF 2021 -- IPS

前言 这个题目折磨了我接近一天,服气了,题目不算难,但是利用写得的疯掉了~~~ 然后这个题目跟之前的不同,之前的题目都是实现一个内核模块,而这个题目是直接实现了一个系统调用(:所以这里不存在…

卷积通用模型的剪枝、蒸馏---蒸馏篇--RKD关系蒸馏(以deeplabv3+为例)

本文使用RKD实现对deeplabv3+模型的蒸馏;与上一篇KD蒸馏的方法有所不同,RKD是对展平层的特征做蒸馏,蒸馏的loss分为二阶的距离损失Distance-wise Loss和三阶的角度损失Angle-wise Loss。 一、RKD简介 RKD算法的核心是以教师模型的多个输出为结构单元,取代传统蒸馏学习中以教…

【通信】为什么用复形式表示信号

引入: 一个实例反映复信号和实信号对应关系(幅度与相位) 复信号的意义 在实际工程中,没有数学意义上的复数信号。再信号与系统中引入复数是为了: ①简化公式,特别是三角函数 ②复数的实部和虚部实际上代…

VBA技术资料MF152:列出工作表中所有单元格的注释

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

FreeRTOS的任务详解、创建与删除

目录 1、任务详解 1.1 什么是任务? 1.2 任务的特点 1.3 任务的状态 1.4 任务的优先级 1.5 任务的堆和栈 2、任务的创建与删除 2.1 相关API 2.2 函数解析 2.2.1 xTaxkCreate() 2.2.2 xTaskCreateStatic() 2.2.3 vTaskDelete() 3、实战案例 3.1 创建两个…

JavaSwing课程设计-实现一个计算器程序

通过JavaSwing技术来实现计算器小程序,效果如下。 源码下载链接 源码下载 博主承诺真实有效,私信可提供支持

JavaEE 多线程详细讲解(2)

1.线程不安全分析 (1)线程不安全的主要原因就是,系统的抢占式执行,对于内核设计者来说,这是非常方便的一个执行方式,但是这却却导致线程不安全的问题,也有不抢占执行的系统,但是这种…