TCP/IP协议粗解

2024-03-24 00:20
文章标签 ip 协议 tcp 粗解

本文主要是介绍TCP/IP协议粗解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本人软件开发人员,在此对TCP/IP做一个了解,所以有的问题并没有深入去探究。

为什么会有IP协议的存在?

底层的以太网协议规定了电子信号如何组成数据包,解决了子网内部的点对点通信,可以使用MAC地址。但是它无法解决多个局域网如何互通的问题,所以就出现了IP协议及IP地址。所以说,IP协议实现了路由功能;

我的理解:MAC是物理层次表明设备的唯一标识,一般不可更改,IP是在网络拓扑中表示设备的唯一标识,可以更改,即使你更改了IP地址,数据仍然会是以之前的IP地址在网络拓扑中传输,此时并不涉及现实设备端口。

以太网的数据包大小是固定的,最初是1518个byte,现在是1522个byte,1500个byte是负载,22byte是头信息,IP数据包在以太网数据包的负载里面,它的头信息最少需要20byte,所以IP数据包最多负载1480byte,TCP数据包在IP数据包里面,头信息最少20byte,所以TCP最大负载为1460byte。但是由于TCP/IP协议往往有额外头信息,所以TCP负载实际为1400byte左右,所以1500byte的数据需要2个TCP数据包。
这里写图片描述

日常开发中,如果要传输10MB的数据,需要发送7100多个包,发送时,TCP协议为每个包编号(seq),以便接受方按照顺序还原,万一丢包,也可以知道丢失的是哪个包。第一个包编号是随机数,假设是1,如该数据负载长度为100,则第二个包编号为101;所以 每个数据包可以得到两个编号:自身的编号和下一个的编号。接受方可以方便排序。

OSI的七层协议

物理层–>数据链路层–>网络层–>传输层–>会话层–>表示层–>应用层

OSI七层模型和TCP/IP四层模型的关系

1.1 OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。

1.2 OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型。

1.3 OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。

TCP:transmission control protocol 传输控制协议

UDP:user data protocol 用户数据报协议

这里写图片描述

这里特别提一下HTTPS:我们知道HTTPS与HTTP的主要区别可以简单的认为是HTTPS多了一个SSL加密,但是SSL加密是在TCP/IP四层协议模型中的传输层进行的,HTTP是属于应用层协议,所以HTTPS可以说是介于传输层和应用层之间的一个协议

常用协议端口: HTTP:80; FTP:21; HTTPS:443; TELNET:23; SSH:22;

数据链路层: 并没有确定的描述这一层的实现,只要求可以提供给其上层—网络层,提供一个访问接口,以便在其上传递IP分组。

网络层: 整个协议栈的核心,功能是把分组发往目标网络或主机。同时为了尽快发送分组,需要沿不同的路径进行分组传递,因此,分组到达的顺序和发送的顺序可能不同,需要上层必须对分组进行排序;

传输层: 使源端主机和目标主机的对等实体可以进行对话。

应用层: 面向不同的网络应用引入了不同的应用层协议。基于TCP协议的,如:FTP、TELNET、HTTP;还有基于UDP协议的;

IP协议提供不可靠、无连接的服务,依赖其他层的协议进行差错控制:在局域网环境中IP协议往往被封装在以太网帧中传递,所有的TCP、UDP协议都封装在IP数据报中传送。

IP报文格式:
这里写图片描述

其中IP头部格式为:
这里写图片描述
版本: 4bit,标识当前协议的版本号,如IPV4为0100,IPV6为0110;
报头长度: 4bit;标识IP头部长度占IP报文头部长度的数目,普通的IP头部值为5,最多可以有60字节的长度。
服务类型: 8bit,前3bit已被忽略,第8bit保留未用,4-7bit分别表示延迟、吞吐量、可靠性、花费。当都取1时表示最小延时、最大吞吐量、最高可靠性、最小费用。全为0表示一般服务。作用举例:TELNET协议可能要求最小延时,FTP可能要求最大吞吐量,SNMP可能要求最高可靠性,NNTP可能要求最小费用,ICMP可能无特殊要求;
总长度字段: 16bit,指明整个数据报的长度,最大长度为65535字节;
标识: 16bit,用来标识主机发送的每一份数据报,通常每发一份则自动加1;
标志位: 3bit,表示一份数据报是否需要分段;
段偏移量: 13bit,如果一份数据报需要分段的话,此字段指明该段位偏移数据距原始数据包开始的位置。
生存期: 8bit,用来表示数据报最多经过的路由器数量,由发送数据的源主机设置:通常为32、64、128,每经过一个路由,其值减1,直到为0时则被丢弃。
协议: 8bit,表示此报文封装的上层协议,如ICMP(1),IGMP(2),TCP(6),UDP(17)
头部校验和: 16bit,内容是根据IP头部计算得到的校验和码。计算方法是:对头部中每个16比特进行二进制反码求和。(和ICMP、IGMP、TCP、UDP不同,IP不对头部后的数据进行校验)。
可选项: 32bit,用来定义一些任选项:如记录路径、时间戳等。这些选项很少被使用,同时并不是所有主机和路由器都支持这些选项。可选项字段的长度必须是32比特的整数倍,如果不足,必须填充0以达到此长度要求。

其中TCP数据头部结构为:
这里写图片描述
源端口号: 16bit,注意并不是IP地址,是应用的端口号,0~65535之间;
顺序号: 32bit,来标识从TCP源端向TCP目标端发送的数据字节流;
确认号: 32bit,只有ACK为1时,这个才有效,包含目标端所期望收到源端的下一个数据字节;
头部长度: 4bit;标识TCP头部长度占IP报文头部长度的数目,没有任何选项的TCP头部长20字节,最多可以有60字节的长度。
URG: 1bit,紧急指针。
ACK: 1bit,确认序列号;
PSH: 1bit,接受方应该尽快将这个报文段交给应用层;
RST: 1bit,重建链接;
SYN: 1bit,发送链接;
FIN: 1bit,释放链接;
窗口大小: 16bit,接受缓冲区,用来告诉TCP链接对方端自己能接受的最大长度;
紧急指针: 只有URG标识位为1时才有意义;

请阅读下一遍文章:
TCP协议讲解(一)

这篇关于TCP/IP协议粗解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/839976

相关文章

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Linux配置IP地址的三种实现方式

《Linux配置IP地址的三种实现方式》:本文主要介绍Linux配置IP地址的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录环境RedHat9第一种安装 直接配置网卡文件第二种方式 nmcli(Networkmanager command-line

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i