Linux网络基础-3

这篇具有很好参考价值的文章主要介绍了Linux网络基础-3。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在上一篇网络基础的博客当中,我们对应用层协议--HTTP协议进行了详解,接下来我们对传输层协议进行详解

目录

1.传输层协议

2.UDP协议

2.1协议内容

2.2协议格式

2.3协议特性

3.TCP协议

3.1协议内容

3.2协议格式

3.3协议特性

3.3.1三次握手建立连接

3.3.2四次挥手断开连接

3.3.3稳定连接总结

3.3.4TCP的保活机制

3.3.5可靠传输机制

1.传输层协议

传输层协议是负责客户端和服务端(两端)之间的数据传输协议,常用的知名协议有TCP协议和UDP协议,那么接下来我们将对这两种协议进行详解。

2.UDP协议

2.1协议内容

UDP协议是一种用户数据报传输协议,它是一种无连接、不可靠、且面向数据报传输的协议。

2.2协议格式

UDP协议格式在底层代码设计中是这个样子的:

struct 
{
    uint16_t uh_sport;//源端端口号
    uint16_t uh_dport;//对端端口号
    uint16_t uh_ulen;//数据报文长度
    uint16_t uh_sum;//校验和
};

四种数据类型都为uint16_t,实际上是short int数据类型,即四种数据各占2字节(16位比特位),共计占据8字节(kb)。

其中,16位的源端端口号和对端端口号描述了是那两端进程在进行通信,16位数据报文长度描述了包含UDP头部在内的数据长度,16为校验和用于校验数据传输的一致性,确保接收到的数据和对方发送的相同(如果数据不一致,则不能交给具体程序处理)。

校验和验证的算法为:二进程反码求和算法。具体过程为:发送方在发送数据时先将校验和字段制0,然后从报头开始逐字节取反相加,高出16为的部分截断再与低16位相加,直到数据末尾。接收方收到校验和之后,也从报头开始逐个取反求和,如果最终得到结果为0则说明收发数据一致。

结合16位数据能描述的最大数字位:65535,所以一份UDP报文包含头部在内,其大小必须小于64k。即当应用层使用sendto发送数据时,数据长度必须小于64-8k,这8k数据为UDP头部的四种数据(2*4k)。

Linux网络基础-3

2.3协议特性

UDP协议具有三条特性,这是在之前博客中有提到的内容,它们分别是:无连接(通信中并不需要建立连接,只需知道对方地址便可发送数据);不可靠(传输中不保证数据有序到达对端);面向数据报传输(传输的每条数据存在大小限制64-8k)。

UDP协议的特性会影响我们对于程序的设计,首先UDP协议传输数据大小存在限制,所以我们在使用sento发送数据时,一次性不能发送太多数据,必须在应用层进行分包处理;其次UDP协议并不保证数据安全和有序到达,所以在应用层需进行包序管理,确保数据安全和传输顺序。

(UDP协议支持局域网广播)

3.TCP协议

3.1协议内容

TCP协议是一种传输控制协议,它是一种面向连接、可靠、且面向字节流传输的协议。

3.2协议格式

我们使用vi /usr/include/netinet/tcp.h命令,可以查看TCP在代码中的设计格式如下:

Linux网络基础-3

结合TCP结构和代码中描述,我们对其中数据种类进行画图展示:

Linux网络基础-3

其中,16位th_sport源端端口和16位th_dport对端端口用于描述通信两端;32位th_seq序号需要用于对传输的每个字节进行排序,接口放会根据接收到的序号来对数据进行排序,确保数据的有序交付;32位th_ack确认序号用于接收方收到数据之后,通过确认序号告知对方多少号之前的序号已被收到。

4位头部长度(头长)是以4字节为单位描述TCP报文头部长度(TCP报头最长60字节,最小20字节),在解析过程中先取出20字节的固定数据,然后根据头长确认取出选项数据。

报头长度并不固定,但其中前20字节内容固定,只有在选项数据中存在0~40字节的不定长度(

6位保留位未被使用,不具有具体的功能;6位标志位有:FIN、SYN、RST、PUSH、ACK和URG,不同的标志代表不同的请求。

16位th_win窗口,用于实现滑动窗口机制,进行流量控制,防止因接收方内存不足而导致数据丢失的情况。

16位th_sum校验和,同UDP协议采用二进制反码求和算法,校验数据收发的一致性。16位th_urp紧急指针,用于指向带外优先数据的结束位置,便于优先数据的控制。

3.3协议特性

对于TCP的协议特性有:面向连接,可靠传输和提供字节流传输服务,我们首先来对特性中的面向连接进行解析,在双方通信之前,需要先建立连接,确保双方在线,且具有数据收发的能力。

具体的连接管理内容为:三次握手建立连接(通信前,先建立连接,确保双发具有数据收发的能力),四次挥手断开连接(通信结束后,存在一个断开连接的过程,避免出现意外)。

3.3.1三次握手建立连接

三次握手建立连接过程示意图如下:

Linux网络基础-3

第一次握手客户端将TCP报文中标志位SYN置1,并随机产生一个序号值seq=J(保存在序列号资源当中),指明客户端连接到服务端的端口,然后发送给服务端,发送结束后客户端进入SYN_SENT状态,等待服务端处理请求。

第二次握手服务端收到客户端请求后(SYN=1,明确是客户端发送的连接建立请求),将TCP报文中标志位SYN和ACK都置1,并使ack=J+1,随机产生一个序号值seq=K,然后发送给客户端,发送结束后服务端进入SYN_RCVD状态,等待客户端进一步请求。

第三次握手客户端收到服务端的确认消息之后,检查序列号ack是否为J+1和标志位ACK是否为1,检查无误后将标志位ACK置1,使序列号ack=K+1并发送给服务端;然后服务端再检查ACK是否为1,ack是否为K+1,检查无误则两端连接建立成功,客户端和服务端进入ESTABLISHED状态,三次握手完成。

3.3.2四次挥手断开连接

四次挥手断开连接过程示意图如下:

Linux网络基础-3

挥手断开请求可以是客户端也可以是服务端,所以图中我们通过请求的发送方和接受发来说明。

第一次挥手发送方发送FIN标志位,并设置序列号seq,然后发送方进入FIN_WAIT_1状态,表示不再有数据向接收方发送。

第二次挥手接收方收到发送的FIN报文段后,向发送方发送标志位为ACK的报文段,并将序列号ack设置为接收到的seq+1,确认应答结束,然后发送发进入FIN_WAIT_2状态,即接收方确认并同意了请求方的关闭请求。

第三次挥手接收方向发送方发送标志位FIN的报文段,请求断开连接。

第四次挥手发送方收到接收方的FIN报文段后,向接收方发送标志位为ACK的报文段,然后进入TIME_WAIT状态。接收方收到发送方的ACK报文段后就会关闭连接,此时发送方等待2MSL(2分钟)没收到回复,则说明接收方已经正常关闭,之后发送方也关闭连接。

3.3.3稳定连接总结

第一个方面是:建立连接时为什么是三次握手。我们建立连接的初衷是双方都具有数据收发的能力,因此双方都需要向对方发送SYN请求,其次服务端收到客户端发送SYN请求时,可以直接发送SYN+ACK报文(SYN用于同步,ACK用于应答),所以建立连接只需要三次握手。

如果两次握手的话,可能SYN延迟到达,与重发的SYN冲突;也可能受到客户端发送完SYN请求后直接退出的恶意攻击。如此四次握手的话,是没有必要的,因为服务端回应时可以直接发送SYN+ACK报文。

第二个方面是:断开连接为什么是四次挥手。断开连接时主动关闭方先发送FIN报文告知对方自己不再发送数据,接收关闭方做出ACK应答。此时接受关闭放仍可能存在数据向主动关闭方发送(缓冲区),所以接受关闭方需等待上层数据发送结束后,才向对方发送FIN报文告知数据发送截至。最后再有主动关闭放发送ACK报文确认应答。

这也是由于TCP协议的全双工模式:两端都具有独立的数据收发能力,所以在连接关闭时,需等待双方数据发送结束。因此,四次挥手断开连接未被合并成为三次。

第三个方面是:为什么需要主动关闭方要等待的时间是2MSL。首先如果因为网络等问题导致,被动关闭方并未收到主动关闭方的ACK报文。那么若是主动关闭方立即关闭,而不等待的话,会导致超时后无法重传FIN报文给对端,导致TCP的全双工通信并未可靠关闭。

其次如果主动关闭方发送最后的ACK请求后立即关闭,然后其再向对方发送了连接建立请求,则无法保证新建立连接的端口和之前连接端口不同,也就意味着新旧端口可能一致。这就导致若之前存在数据滞留的情况,这些滞留的数据便会顺着相同端口的新连接被传输,导致数据收发混乱。所以TCP连接需要在TIME_WAIT状态等待2MSL,才能保证本次连接的数据全部消失在网络中。

3.3.4TCP的保活机制

在TCP通信当中,如果客户端和服务端通信频率不高,通信中突然网络断开,双方没有四次挥手断开连接的机会。那么因为二者通信频率较低,可能连接断开的频率需要很久才会被发现,不存在的通信较长时间的占用资源很明显是我们不期待看到的。

所以我们引入TCP的保活机制,当客户端和服务端长时间未进行通信时,则TCP服务器会自动向客户端发送保活探测包,要求得到对方响应,若多次请求为得到响应,则认为连接断开。在ipv4标准中,默认为若两端7200s未进行通信,则每隔75s向客户端发送保活探测包,9次未得响应的话,则认为连接断开。(以上时间均可配置,可用套接字选项进行设置)

3.3.5可靠传输机制

TCP协议的可靠传输机制是通过一些特殊机制来实现的:文章来源地址https://www.toymoban.com/news/detail-446927.html

  • 面向连接--确保双方都具有数据收发能力;
  • 丢包检测机制--确认应答机制:接收方要针对收到的每一条数据进行回复;
  • 丢包重传机制--超时重传机制:等待确认回复超时则重传数据;
  • 序号字段--进行包序管理,有序交付数据;
  • 校验和字段--校验数据一致性,不一致则重传。

到了这里,关于Linux网络基础-3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络安全入门教程(非常详细),从零基础入门到精通,看完这一篇就够了

    “没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万! 2、人才缺口大,就业机会多

    2023年04月10日
    浏览(77)
  • 全网网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇绝对够了

    由于我之前写了不少网络安全技术相关的故事文章,不少读者朋友知道我是从事网络安全相关的工作,于是经常有人在微信里问我: 我刚入门网络安全,该怎么学?要学哪些东西?有哪些方向?怎么选? 不同于Java、C/C++等后端开发岗位有非常明晰的学习路线,网路安全更多

    2024年02月08日
    浏览(49)
  • 【Linux网络】网络基础(一)

    Internet的最早起源于美国国防部高级研究计划署DARPA(Defence Advanced Research Projects Agency)的前身ARPAnet(阿帕网),该网于1969年投入使用。由此,ARPAnet成为现代计算机网络诞生的标志。 从六十年代起,由ARPA提供经费,联合计算机公司和大学共同研制而发展起来的ARPAnet网络。最

    2024年02月13日
    浏览(53)
  • Linux网络基础 — 网络层

    目录 IP协议 IP协议报头格式 网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 补充   网络层 在复杂的环境中确定一个合适的路径。 ip具有将数据从 主机A 跨网络送到 主机B 的能力。 主机: 配有IP地址,但是不进行路由控制的设备。 路由器: 即配有IP地址

    2024年02月16日
    浏览(42)
  • Linux网络编程:网络基础

    文章目录: 一:协议   二:网络应用设计模式_BS模式和CS模式 三:网络分层模型(OSI七层 TCP/IP四层) 四:通信过程 五:协议格式  1.数据包封装 2.以太网帧格式和ARP数据报格式  3.IP段格式  4.UDP数据报格式 5.TCP数据报格式 六:TCP协议 1.TCP通信时序(面向连接的可靠数据通

    2024年02月12日
    浏览(82)
  • 【Linux网络编程】网络基础一

    从今天开始我们将要从系统横跨到网络的学习了,因此有些书我们就可以读起来了。 操作系统 原理: 《操作系统精髓与设计原理》、《现代操作系统》 Linux原理方面的书 : 《Linux内核设计与实现》–陈莉君、《深入理解Linux内核》(选读–不作为重点) Linux编程方面的书: 《

    2024年04月15日
    浏览(59)
  • linux【网络编程】之网络基础

    “协议” 是一种约定 软件设计方面的优势—低耦合 分层依据:功能比较集中,耦合度较高的模块—高内聚 每一层都要解决特定的问题 每一层都有自己匹配的协议,每一层协议都解决自己的问题 OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参

    2024年02月04日
    浏览(53)
  • 【Linux网络编程一】网络基础1(网络框架)

    本篇开始总结网络知识,系统部分到此结束。 网络的本质就是在获取和生产数据,而系统的本质就是在处理数据。从网络中获取到数据利用系统调用来处理数据。而网络的本质也就是文件,我往文件里写,就是往网卡里写,往网卡里写,就是往网络里写。 我们在生活中都是

    2024年02月19日
    浏览(38)
  • Linux网络编程 网络基础知识

    目录 1.网络的历史和协议的分成 2.网络互联促成了TCP/IP协议的产生 3.网络的体系结构 4.TCP/IP协议族体系 5.网络各层的协议解释 6.网络的封包和拆包 7.网络预备知识      Internet-\\\"冷战\\\"的产物 1957年十月和十一月,前苏联先后欧两颗”Spuinik”卫星上天 1958年美国总统艾森豪威尔向

    2024年02月10日
    浏览(47)
  • Linux 网络基础(1)基础知识、IP地址、端口、协议、网络字节序

    网络发展背景: 网络的划分:局域网(覆盖范围在1000m以内)、城域网(覆盖范围在20km以内)、广域网(更大范围) 组网方式:以太网、令牌环网.... 日常名词:互联网,因特网----说的是一个网络,就是国际化的广域网 网卡:实现数字信号与电信号之间的转换 中继器:信号

    2024年02月05日
    浏览(92)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包