近期事情,跟网络协议干系,这让我天然会更深开学习网络协议,而之前很长一段时间,我对网络协议的了解都停留在比力浅的层面。
好比:TCP是面向毗连的、可靠传输,而UDP好坏毗连的、不成靠传输,TCP建连必要3次握手,会形成delay,UDP更快。
好比:socket编程,办事器socket create、bind、listen、accept、read/write、shutdown/close,客户端socket create、connect、read/write、shutdown/close,再加上epoll/select这几下子。
再好比:我晓得网络编程要无视SIGPIPE信号不然会挂,read前往0代表对端主动关闭,非壅闭的read要放在循环里要思索前往值,多路复用以及壅闭、非壅闭的区别。
TCP/UDP的区别上,我是如此了解的:从北京到杭州,TCP相当于修了一条高铁线路(建连)再通车发货(传输数据),而UDP相当于寄快递,丢了不管(直接传输数据)。
外表的了解对不合错误?可以说对,也可以说不合错误。关于使用步骤员来说,有了外表的熟悉+熟习socket编程接口,够了吗?不够吗?
大物理学家费曼提出一个高效的费曼学习法,即从成绩动手,试着把成绩都讲出来,以教代学,一旦你能把成绩都讲清晰,便学会了。以是我想实验一下把TCP/IP讲清晰,借此让本人学明白,特地协助一下读者。
固然《TCP/IP详解卷1》是一本关于互联网协议族很严谨细致的书,但在我看来,它略微有点难懂,约莫必要读几遍,才干心心相印。固然我没有才能把这个成绩说的更好,但由于我履历过从稀里懵懂到稍有所悟的历程,这约莫是大师不成比的,我将尽力用普通易懂的言语把TCP/IP干系的知识讲清晰。
TCP/IP协议族是一组协议的聚集,也叫互联网协议族,用来完成互联网上主机之间的互相通讯。TCP和IP只是此中的2个协议,也是很紧张的2个协议,以是用TCP/IP来定名这个互联网协议族,实践上,它还包含其他协议,好比UDP、ICMP、IGMP、ARP/RARP等。
大学《盘算机网络》教科书上有经典的网络ISO七层模子,但七层区分太细了,稍显繁琐,不容易记取。
互联网协议族TCP/IP按粗粒度的四层区分,两种区分的比力图让互干系系一清二楚。
分层是盘算机范畴的常用本事,好比互联网后端的三层架构“接入-逻辑-存储”就是分层头脑的典范使用。
分层是为了断绝,通太过层区分本能机能,拆解成绩,层与层之间商定接口,屏蔽完成细节。
TCP/IP自下到上区分为链路层、网络层、传输层、使用层。下属向表层提供才能,表层使用下属的才能提供更高的笼统。
1. 链路层,也称网络接口层,包含利用体系的装备驱动步骤和网卡,它们一同处理与传输前言(光纤等)的物理接口细节。
2. 网络层,也就是IP层,卖力处理IP datagram在网络中的传输,IP层传输的是IP datagram,借助路由表,把IP datagram从网络的一端传输到另一端,简而言之:IP完成包的路由传输,IP协媾和路由器事情在网络层。
3. 传输层,提供端到端之间的通讯,包含提供面向毗连和高可靠性的TCP,以及无毗连不成靠的UDP。貌似TCP更好,但实践不是如此,UDP由于不必要建连开支,以是更快,使用得也很广,好比新一代互联网协议HTTP3就从TCP转向UDP,应依据顺应场景选择传输层协议。
4. 使用层,跟使用干系,不同使用处理不同成绩,必要不同的使用层协议。
链路层处理数据在前言上的传输,以及主机与网卡、光纤等打交道的细节。由于与硬件干系,以是必要借助体系的驱动步骤,链路层协议就是界说这些细节的,好比怎样把数据从网卡发送到光纤,接纳什么格式编码等,它处理的数据在前言上表现、活动的成绩。
光有链路层功效一定是不够的,网络上有不计其数的机器,主机A与B通讯,你不克不及将数据发到主机C,以是模仿实际,要为主机分派网络地点,经过IP地点去标识网络中的一台主机,发送一个数据包,必要准确路由到目标地,这就好比你从家到公司,要颠末哪些途径,必要舆图,而路由表就相似这张舆图。IP处理的是数据包在网络中的传输路由的成绩。
有了网络层的传输路由才能,还不够,由于IP报在传输历程中约莫丢包,好比正中履历过的路由器缓冲区满了便会丢包,如此不成靠,假如必要可靠传输的才能,便必要传输层基于IP层,提供更多的才能,TCP处理了可靠性成绩。具体而言,假如丢包了,TCP层会卖力超时重传,它经过吸收确认和重传机制确保了可靠传输。别的,由于IP报都是独立路由的,以是从主机A到主机B,一份数据被拆分红x、y两个IP报先后发送,这2个包约莫选择不同的传输途径,如此有约莫y包先于x包抵达,但我们渴望在吸收端(主机B)规复这个数据的信息,但我们无法控制IP报的抵达排序,以是,我们必要在吸收端规复数据,我只必要在x、y包里纪录它属于数据块的哪个局部,然后重组这份数据,这正是TCP做的,它会重新组装IP报,从而确保排序性,递交给使用层。
偶尔分并不必要确保可靠性温和序性,这便是UDP能提供的,它只是简便的把数据封装成IP报,然后经过IP层路由发送到目标端。
再往上,便是使用层协议了,好比http,又好比游戏办事器自界说协议,使用层协议通常基于TCP大概UDP做传输。
什么是协议?懒得去翻协议的种种威望界说了,我以为协议就是商定,跟实际生存中协议这个词涵义差不多。网络协议就是通讯两边协同恪守的商定,更具体一点,就是界说数据在网络上传输的格式、端正和流程。
由于网络是分层模子,不同层有不同层的作用,以是为各层界说各层的端正,各层对应的各层协议。
前方讲了TCP/IP协议族包含很多协议,这些协议分属不同的分层,承当不同的作用。
使用层和传输层使用端到端(end-to-end)协议,网络层提供的是逐跳(hop-by-hop)协议。
A给B经过网络传送一块数据,可以假想仅仅是传输这块原始数据是不够的,由于网络传输历程中,网络包到了某个路由器,必要转发,而转发必需依托数据包的一些附加信息,好比目标机器。
发送端在发送数据的时分,将原始数据依照协议格式加上一些控制信息,包装成可在网络上准确传输数据包的历程叫封装。
TCP/IP协议族是层层封装的,从使用层到链路层,每颠末一层都要添加一些分外信息(首、尾部)。
改准确的说,在IP和链路层传输的数据单位叫分组(Packet),分组既可以是一个IP datagram也可以是IP datagram的一个分片(fragment)。
UDP的封装跟TCP略有不同,主要表如今颠末传输层(UDP)之后添加的是8字节UDP首部,产生UDP datagram。
封装历程中,颠末TCP/UDP层的时分,会把端标语添加到TCP/UDP首部;颠末IP层的时分,会把协议典范(TCP or UDP or ICMP or IGMP)添加到IP首部;颠末链路层的时分,会把帧典范(IP or ARP or RARP)添加到以太网首部。这些信息将被用于吸收端的处理。
吸收端收到数据后,要实行跟发送端相反的解封利用,我们可以把发送端的数据封装比如成沐浴后一层层穿衣服,而吸收端的利用,相似沐浴前一层层脱衣服,把首尾部剥离,获取转达的原始数据。
由于网络上的主机有不同字节序,如今要经过网络传输,便必要商定一致的网络字节序(大端序),接纳小端序的主机在网络传输数据的时分要转为大端序。
互联网上每个接口都有一个唯一的网络地点,也叫IP地点,IP地点有IPv4和IPv6两个版本,IPv4是32位4字节的整数,每个字节(8bit)的取值范围是0~255,以是可以把4字节的IPv4用四个点分开的byte值表现,好比140.252.13.88,每个十进制数值对应32位整数中的每个字节,这种表现法叫点分十进制表现法,很显然,点分十进制法和int32两种表现法之间很容易互相转换。
IPv4地点区分为ABCDE五类,32位地点表现的数值空间仅限,难以为互联网上的一切联网装备分派独立的IP地点,以是便存在动态分派、共享、公网+内网地点转化(NAT)等成绩,实质上是为了处理IP地点不够用的成绩。
IPv6使用128bit,2的128次方就十分大了,号称可以为地球上每粒沙子分派一个ip地点。
IP数据报(网络层)用IP地点、而以太网帧(链路层)则是用硬件(48位Mac)地点,ARP和RARP用于IP地点和硬件地点之间做映射(转换)。
TCP/UDP接纳16位端标语来识别(区分)使用,好比主机A向主机B发送了一个IP报,主机B的内核收到该IP报之后,应该交给哪个使用步骤去向理呢?端标语就是用来干这个的,内核会维护端标语到使用步骤之间的对应干系。
比力常用的使用层协议有商定的端标语,也就是着名端标语,而1024~5000之间的端标语是分派给TCP/IP暂且用的,而大于5000的另做他用。也就是说,你用TCP办法去连网络办事器,当地为该socket分派的端标语会在1024~5000之间,这取决于利用体系的端口分派战略。
域名体系(DNS)提供主机名字和IP地点之间的转换,好比www.baidu.com是一个域名,使用步骤可以经过一个标准库函数(gethostbyname)来取得给定名字主机的IP地点,标准库函数(gethostbyaddr)完成逆利用。
ip地点是一串数字,涵义不清、也不便利于影象,主机名涵义更明晰,www.baidu.com你就很容易记取,这也是为什么存在IP地点还必要主机名的缘故。
吸收端吸收到以太网数据帧(Frame)之后,必要像剥洋葱一样,从协议栈由底向上升,即依照链路层->网络层->传输层->使用层的排序,去掉各层协议添加的首尾部,将数据取出,交给最表层使用步骤,这个历程叫Demultiplexing,尊从册本的翻译叫分用。
回忆前方封装的形貌,在传输层、网络层、链路层,分散将端标语存入TCP/IP首部,将协议典范存入IP首部,将帧典范存入以太网帧首部。以是在吸收端,将一层层拆掉首部,取出对应信息,然后做分派,丢给不同模块处理,上图就是整个处理历程。
本文讲了地点、域名、端口、TCP/IP分层模子、封装、分用等看法。
你最好能记取TCP/IP链路层->网络层->传输层->使用层的四层区分。
TCP segment、UDP datagram、IP datagram、IP fragment、以太网frame、以及IP层和链路层之间传输的数据单位packet,这些看法你最好分清晰,如此扳谈的时分会显得比力专业而不是很土。
数据封装,多看几遍你便能记取了。
TCP封装格式:以太网首部(14)+IP首部(20)+TCP首部(20)+使用数据+以太网尾部(4)
UDP封装格式:以太网首部(14)+IP首部(20)+UDP首部(8)+使用数据+以太网尾部(4)
使用层协议在使用层完成,而传输层、网络层、链路层都是在内核完成,以是想修正大概优化底层协议很难,由于你几乎动不了内核,由于网络上的多量装备OS你没法一并改正来,这就是所谓的网络装备僵化成绩,HTTP3用UDP交换TCP,就是想在使用层本人去完成可靠传输等。
每个以太网帧有长度限定(48~1500),网络上每个装备也有对包的长度限定,IP报大了就要分片,分片约莫产生在发送端,也有约莫产生在正中装备,但应该尽力制止分片,IP报会带有信息让分片后可以重组,MTU的看法可以了解一下。
ICMP和IGMP逻辑上属于网络层,由于他们是IP协议的从属协议,但实践上,ICMP和IGMP报文都被封装为IP datagram传输,以是又可以把他们视为IP层之上的协议。
相反ARP和RARP用于IP地点和硬件MAC地点互相转换,逻辑上属于链路层,但实践上arp和rarp报文跟IP datagram一样,都被封装成以太网Frame传输。
吸收端收到以太网帧之后,会走分用流程,终极将原始数据交给使用步骤。
TCP/IP协议的使用步骤常常使用socket编程接口。
有很多跟网络干系的东西,好比ping、ifconfig、netstat、arp、tcpdump、wireshark等。
一年前,我对网络编程这块,头脑里充溢疑问。
众所周知,TCP建连三次握手和断连四次握手,但如前所述,任何时分,从主机A都可以随意发一个IP报到主机B,网络主机之间是经过IP层完成路由转发的,两点之间的每个IP报都是独立路由的,既然如此,为什么还要建连?还要糜费时间做A->B、B->A、A->B往返?直接把包发已往不就完了吗?
假定经过AB创建的3个IP报的作用是表现AB之间的网络连通性?哪又有什么作用?由于网络是随时厘革的,如今连通又不代表下一刻连通。建连之后仿佛并不存在AB之间的真正毗连,只是两头OS层面维护的一个形态(数据目标)?是假造毗连?
建连毕竟是什么意思?客户端发送一个IP报到办事器去倡导毗连?那跟传输数据的平凡IP报又有什么区别?
双工是什么意思?为什么socket关闭一半传输之后就不克不及发送数据了?网络上IP报不是可以随意传输吗?这个限定是哪个场合添加的?
拥塞控制是什么?Nagle是什么?滑动窗口是什么?TCP为什么要保活?
socekt的编程接口和种种看法跟TCP/IP原理有怎样的对应干系?学完TCP/IP原理对了解socket编程有什么协助?
没有穷究TCP/IP原理之前,我但是是有很多成绩的,只是做使用步骤开发,仿佛没搞懂那些成绩也还可以将就干,但毕竟是有点糊里懵懂,以为不太爽。
原本我想一篇文章讲清晰TCP/IP的主要内容,但是写着写着发觉,如此文章会十分长,以是我决定多写几篇,每篇都讲清晰一个主题。
版权声明:本文来自互联网整理发布,如有侵权,联系删除
原文链接:https://www.yigezhs.comhttps://www.yigezhs.com/wangluozixun/53613.html