zoukankan      html  css  js  c++  java
  • 《网络是怎样连接的》学习笔记

    前言

    本书以探索之旅的形式,从在浏览器中输入网址开始,一路追踪了到显示出网页的内容为止的整个过程,以图配文,讲解了网络的全貌,并重点介绍了实际的网络设备和软件是如何工作的。

    这本书的整体架构如下图:

    第一章 浏览器生成消息

    1.生成HTTP请求消息

    浏览器要做的第一步工作就是对URL进行解析,从而生成发送给Web服务器的请求消息。

    解析过程如下图:

    HTTP 的基本思路,就是向服务器发送请求,请求包含了方法和 URL,服务器给予响应,包含了响应码和响应体等。

    请求方法有:get、post、put、delete 等。

    请求消息包含:请求头、消息头、消息体。
    响应消息包含:状态码、消息头、消息体。

    1条请求消息中只能写1个URI。如果需要获取多个文件,必须对每个文件单独发送1条请求。

    2.向DNS服务器查询Web服务器的IP地址

    在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的IP地址。因此,在生成HTTP消息之后,下一个步骤就是根据域名查询IP地址。

    IP地址的表示方法如下图:

    子网掩码表示网络号与主机号之间的边界。

    主机号部分全部为0代表整个子网,主机号部分全部为1代表向子网上所有设备发送包,即广播。

    为了方便记忆,人类用域名,路由器用ip,为了弥补两者的差距,于是 DNS服务器出现了

    我们计算机上都有DNS客户端,也称为DNS解析器,DNS解析器向DNS服务器发送请求并获取响应,解析响应体中的ip地址存入内存中。

    DNS解析器,就是一个程序,它包含在操作系统的Socket库中,库就是一堆通用程序组件的集合,Socket库也是一种库,其中包含的程序组件可以让其他的应用程序调用操作系统的网络功能[插图],而DNS解析器就是这个库中的其中一种程序组件。

    简言之:根据域名查询IP地址时,浏览器会使用Socket库中的解析器。

    3.全世界DNS服务器的大接力

    当DNS解析器向服务器发送请求时,DNS服务器会从域名与IP地址的对照表中查找相应的记录,并返回IP地址

    DNS服务器中的所有信息都是按照域名以分层次的结构来保存的,一个域的信息是作为一个整体存放在DNS服务器中的。

    互联网中有数万台DNS服务器,根域的DNS服务器中保管着com、jp等的DNS服务器的信息。由于上级DNS服务器保管着所有下级DNS服务器的信息,所以我们可以从根域开始一路往下顺藤摸瓜找到任意一个域的DNS服务器。

    分配给根域DNS服务器的IP地址在全世界仅有13个。

    找到目标DNS服务器的过程如下图:

    在真实的互联网中,一台DNS服务器可以管理多个域的信息。

    此外,有时候并不需要从最上级的根域开始查找,因为DNS服务器有一个缓存功能,可以记住之前查询过的域名。

    4.委托协议栈发送消息

    向操作系统内部的协议栈发出委托时,需要按照指定的顺序来调用Socket库中的程序组件。

    收发数据的整体思路如下图:

    建立管道的关键在于管道两端的数据出入口,这些出入口称为套接字。我们需要先创建套接字,然后再将套接字连接起来形成管道。

    综上所述,收发数据的操作分为若干个阶段,可以大致总结为以下4个。

    • (1)创建套接字(创建套接字阶段)

    • (2)将管道连接到服务器端的套接字上(连接阶段)

    • (3)收发数据(通信阶段)

    • (4)断开管道并删除套接字(断开阶段)

    首先是套接字创建阶段。客户端创建套接字的操作非常简单,只要调用Socket库中的socket程序组件就可以了.

    接下来,应用程序通过调用Socket库中的名为connect的程序组件来连接起来。这里的要点是当调用connect时,需要指定描述符、服务器IP地址和端口号这3个参数.

    应用程序需要在内存中准备好要发送的数据。根据用户输入的网址生成的HTTP请求消息就是我们要发送的数据。接下来,当调用write时,需要指定描述符和发送数据,然后协议栈就会将数据发送到服务器。

    当消息返回后,需要执行的是接收消息的操作。接收消息的操作是通过Socket库中的read程序组件委托协议栈来完成的

    当浏览器收到数据之后,收发数据的过程就结束了。接下来,我们需要调用Socket库的close程序组件进入断开阶段。最终,连接在套接字之间的管道会被断开,套接字本身也会被删除。

    第二章 用电信号传输 TCP/IP 数据

    TCP/IP软件采用分层结构,上层会向下层逐层委派工作,如下图:

    应用程序的下面是Socket库,其中包括解析器。

    再下面就是操作系统内部了,其中包括协议栈。协议栈的上半部分有两块,分别是负责用TCP协议收发数据的部分和负责用UDP协议收发数据的部分

    浏览器、邮件等一般应用程序收发数据时用TCP;DNS查询等收发较短的控制数据时用UDP。

    下面一半是用IP协议控制网络包收发操作的部分。此外,IP中还包括ICMP协议和ARP协议。ICMP用于告知网络包传送过程中产生的错误以及各种控制消息,ARP用于根据IP地址查询相应的以太网MAC地址。

    IP下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收的操作。

    1.创建套接字

    首先是创建套接字的阶段,应用程序调用socket申请创建套接字,协议栈根据应用程序的申请执行创建套接字的操作。

    在这个过程中,协议栈首先会分配用于存放一个套接字所需的内存空间。

    套接字刚刚创建时,数据收发操作还没有开始,因此需要在套接字的内存空间中写入表示这一初始状态的控制信息。到这里,创建套接字的操作就完成了。

    2.连接服务器

    创建套接字之后,应用程序(浏览器)就会调用connect,随后协议栈会将本地的套接字与服务器的套接字进行连接。

    我们需要把服务器的IP地址和端口号等信息告知协议栈,这是连接操作的目的之一。

    连接操作的第一步是在TCP模块处创建表示连接控制信息的头部。

    通过TCP头部中的发送方和接收方端口号可以找到要连接的套接字。

    3.收发数据

    数据收发操作是从应用程序调用write将要发送的数据交给协议栈开始的。

    应用程序在调用write时会指定发送数据的长度,在协议栈看来,要发送的数据就是一定长度的二进制字节序列而已。

    其次,协议栈并不是一收到数据就马上发送出去,而是会将数据存放在内部的发送缓冲区中,并等待应用程序的下一段数据。

    协议栈会根据一个叫作MTU的参数来进行判断每个网络包能容纳的数据长度。

    MTU表示一个网络包的最大长度,在以太网中一般是1500字节

    MTU是包含头部的总长度,因此需要从MTU减去头部的长度,然后得到的长度就是一个网络包中所能容纳的最大数据长度,这一长度叫作MSS。当从应用程序收到的数据长度超过或者接近MSS时再发送出去,就可以避免发送大量小包的问题了。

    对较大的数据进行拆分

    应用程序的数据一般都比较大,因此TCP会按照网络包的大小对数据进行拆分。

    使用ACK号确认网络包已收到

    序号和ACK号的用法如下图:

    通过“序号”和“ACK号”可以确认接收方是否收到了网络包。

    根据网络包平均往返时间调整ACK号等待时间

    具体来说,TCP会在发送数据的过程中持续测量ACK号的返回时间,如果ACK号返回变慢,则相应延长等待时间;相对地,如果ACK号马上就能返回,则相应缩短等待时间

    使用窗口有效管理ACK号

    所谓滑动窗口,就是在发送一个包之后,不等待ACK号返回,而是直接发送后续的一系列包。这样一来,等待ACK号的这段时间就被有效利用起来了。

    接收HTTP响应消息

    首先,浏览器在委托协议栈发送请求消息之后,会调用read程序来获取响应消息。

    首先,协议栈会检查收到的数据块和TCP头部的内容,判断是否有数据丢失,如果没有问题则返回ACK号。然后,协议栈将数据块暂存到接收缓冲区中,并将数据块按顺序连接起来还原出原始的数据,最后将数据交给应用程序。

    4. 从服务器断开并删除套接字

    断开连接的交互过程如下图:

    删除套接字

    和服务器的通信结束之后,用来通信的套接字也就不会再使用了,这时我们就可以删除这个套接字了。不过,套接字并不会立即被删除,而是会等待一段时间之后再被删除。

    数据收发操作小结

    数据收发操作的第一步是创建套接字。

    创建套接字之后,客户端会向服务器发起连接操作。首先,客户端会生成一个SYN为1的TCP包并发送给服务器

    当这个包到达服务器之后,服务器会返回一个SYN为1的TCP包

    当这个包到达客户端时,客户端会向服务器返回一个包含表示确认的ACK号的TCP包

    双方进入数据收发阶段:

    以Web为例,首先客户端会向服务器发送请求消息。TCP会将请求消息切分成一定大小的块,并在每一块前面加上TCP头部,然后发送给服务器。

    当服务器收到客户端的请求消息后,会向客户端返回响应消息,这个过程和刚才的过程正好相反。

    服务器的响应消息发送完毕之后,数据收发操作就结束了,这时就会开始执行断开操作,

    服务器先发送一个FIN为1的TCP包,然后客户端返回一个表示确认收到的ACK号,接下来,双方还会交换一组方向相反的FIN为1的TCP包,和包含ACK号的TCP包。最后,在等待一段时间后,套接字会被删除。

    5.IP与以太网的包收发操作

    包是由头部和数据两部分构成的。头部包含目的地址等控制信息,可以把它理解为快递包裹的面单;头部后面就是委托方要发送给对方的数据,也就相当于快递包裹里的货物。

    网络包的结构如下图:

    路由器和集线器

    路由器和集线器是两种不同的转发设备,它们在传输网络包时有着各自的分工。

    • (1)路由器根据目标地址判断下一个路由器的位置

    • (2)集线器在子网中将网络包传输到下一个路由。

    实际上,集线器是按照以太网规则传输包的设备,而路由器是按照IP规则传输包的设备。

    具体来说,TCP/IP 包包含如下两个头部。

    • (a)MAC头部(用于以太网协议)

    • (b)IP头部(用于IP协议)

    IP网络包的传输方式如下图:

    P模块负责添加如下两个头部。

    • (1) MAC头部:以太网用的头部,包含MAC地址

    • (2)IP头部:IP用的头部,包含IP地址

    无论要收发的包是控制包还是数据包,IP对各种类型的包的收发操作都是相同的。

    IP头部的“接收方IP地址”填写通信对象的IP地址。发送方IP地址需要判断发送所使用的网卡,并填写该网卡的IP地址。

    MAC头部的开头是接收方和发送方的MAC地址,IP地址的长度为32比特,而MAC地址为48比特。

    通过ARP查询目标路由器的MAC地址

    ARP,地址转换协议,通过 IP 地址寻找 MAC 地址,过程如下图:

    以太网的基本知识

    以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术,它的原型如图所示。从图上不难看出,这种网络的本质其实就是一根网线。

    将IP包转换成电或光信号发送出去

    将数字信息转换为电或光信号,才能在网线上传输,负责执行这一操作的是网卡,但网卡也无法单独工作,要控制网卡还需要网卡驱动程序。

    网卡的ROM中保存着全世界唯一的MAC地址,这是在生产网卡时写入的。网卡中保存的MAC地址会由网卡驱动程序读取并分配给MAC模块。

    给网络包再加3个控制数据

    网卡是如何将包转换成电信号并发送到网线中的?

    网卡驱动从IP模块获取包之后,会将其复制到网卡内的缓冲区中,然后向MAC模块发送发送包的命令。

    接下来就轮到MAC模块进行工作了。首先,MAC模块会将包从缓冲区中取出,并在开头加上报头起始帧分界符,在末尾加上用于检测错误的帧校验序列,如下图:

    报头用来确定包的读取时机,SFD用来确定帧的起始位置。

    末尾的FCS(帧校验序列)用来检查包传输过程中因噪声导致的波形紊乱、数据错误,它是一串32比特的序列。

    向集线器发送网络包

    加上报头、起始帧分界符和FCS之后,我们就可以将包通过网线发送出去了。发送信号的操作分为两种:

    • 一种是使用集线器的半双工模式

    • 另一种是使用交换机的全双工模式。

    接收返回包

    在使用集线器的半双工模式以太网中,一台设备发送的信号会到达连接在集线器上的所有设备。

    如果FCS校验没有问题,接下来就要看一下MAC头部中接收方MAC地址与网卡在初始化时分配给自己的MAC地址是否一致,如果接收方MAC地址和自己MAC地址一致,则将包放入缓冲区中。

    将服务器的响应包从IP传递给TCP

    服务器返回的包的以太类型应该是0800,因此网卡驱动会将其交给TCP/IP协议栈来进行处理。

    接下来就轮到IP模块先开始工作了,第一步是检查IP头部,确认格式是否正确。如果格式没有问题,下一步就是查看接收方IP地址。

    如果接收到的包是经过分片的,那么IP模块会将它们还原成原始的包。

    到这里,IP模块的工作就结束了,接下来包会被交给TCP模块。TCP模块会根据IP头部中的接收方和发送方IP地址,以及TCP头部中的接收方和发送方端口号来查找对应的套接字。找到对应的套接字之后,就可以根据套接字中记录的通信状态,执行相应的操作了。

    6. UDP协议的收发操作

    像DNS查询等交换控制信息的操作基本上都可以在一个包的大小范围内解决,这种场景中就可以用UDP来代替TCP。

    UDP没有TCP的接收确认、窗口等机制,因此在收发数据之前也不需要交换控制信息,也就是说不需要建立和断开连接的步骤,只要在从应用程序获取的数据前面加上UDP头部,然后交给IP进行发送就可以了。

    接收也很简单,只要根据IP头部中的接收方和发送方IP地址,以及UDP头部中的接收方和发送方端口号,找到相应的套接字并将数据交给相应的应用程序就可以了。

    除此之外,UDP协议没有其他功能了,遇到错误或者丢包也一概不管。

    第3章 从网线到网络设备:集线器、交换机和路由器

    1. 信号在网线和集线器中传输

    网络包从客户端计算机发出之后,要经过集线器、交换机和路由器最终进入互联网。实际上,我们家里用的路由器已经集成了集线器和交换机的功能。

    网卡中的PHY(MAU)模块负责将包转换成电信号,信号通过RJ-45接口进入双绞线。

    以太网信号的本质是正负变化的电压,可以认为网卡的PHY(MAU)模块就是一个从正负两个信号端子输出信号的电路。

    信号在网线的传输过程中,能量会逐渐损失。网线越长,信号衰减就越严重。

    局域网网线使用的是双绞线,其中“双绞”的意思就是以两根信号线为一组缠绕在一起,这种拧麻花一样的设计是为了抑制噪声的影响。

    当信号到达集线器后,会被广播到整个网络中。

    以太网的基本架构就是将包发到所有的设备,然后由设备根据接收方MAC地址来判断应该接收哪些包,而集线器就是这一架构的忠实体现,它就是负责按照以太网的基本架构将信号广播出去。

    信号到达集线器的PHY(MAU)模块后,会进入中继电路。中继电路的基本功能就是将输入的信号广播到集线器的所有端口上。

    2. 交换机的包转发操作

    首先,信号到达网线接口,并由PHY(MAU)模块进行接收,这一部分和集线器是相同的。

    接下来,PHY(MAU)模块会将网线中的信号转换为通用格式,然后传递给MAC模块。

    MAC模块将信号转换为数字信息,然后通过包末尾的FCS校验错误,如果没有问题则存放到缓冲区中。

    这部分操作和网卡基本相同。

    网线接口和后面的电路部分加在一起称为一个端口,也就是说交换机的一个端口就相当于计算机上的一块网卡,但和网卡不同,交换机的端口不具有MAC地址。

    交换机根据MAC地址表查找MAC地址,然后将信号发送到相应的端口。

    交换机会自行更新或删除地址表中的记录,不需要手动维护。

    全双工模式是交换机特有的工作模式,它可以同时进行发送和接收操作,集线器不具备这样的特性。

    交换机可以同时转发多个包。

    3. 路由器的包转发操作

    路由器是基于IP设计的,而交换机是基于以太网设计的。

    路由器包括转发模块和端口模块两部分:

    • 转发模块负责判断包的转发目的地

    • 端口模块负责包的收发操作。

    路由器的结构如下图:

    路由器的基本原理

    路由器在转发包时,首先会通过端口将发过来的包接收进来,这一步的工作过程取决于端口对应的通信技术。

    对于以太网端口来说,就是按照以太网规范进行工作,而无线局域网端口则按照无线局域网的规范工作,总之就是委托端口的硬件将包接收进来。

    接下来,转发模块会根据接收到的包的IP头部中记录的接收方IP地址,在路由表中进行查询,以此判断转发目标。

    然后,转发模块将包转移到转发目标对应的端口,端口再按照硬件的规则将包发送出去,也就是转发模块委托端口模块将包发送出去的意思。

    路由器的各个端口都具有MAC地址和IP地址。

    路由器根据“IP地址”判断转发目标。

    路由器会忽略主机号,只匹配网络号。

    路由器的端口都具有MAC地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃。

    通过路由器转发的网络包,其接收方MAC地址为路由器端口的MAC地址。

    路由表中子网掩码为0.0.0.0的记录表示“默认路由”。

    IP头部中的TTL(Time to Live,生存时间)字段表示包的有效期,包每经过一个路由器的转发,这个值就会减1,当这个值变成0时,就表示超过了有效期,这个包就会被丢弃。

    发送方在发送包时会将TTL设为64或128,也就是说包经过这么多路由器后就会“寿终正寝”。

    路由器判断下一个转发目标的方法如下。

    ●如果路由表的网关列内容为IP地址,则该地址就是下一个转发目标。

    ●如果路由表的网关列内容为空,则IP头部中的接收方IP地址就是下一个转发目标。

    路由器也会使用ARP来查询下一个转发目标的MAC地址。

    路由器与交换机的关系

    给包加上MAC头部并发送,从本质上说是将IP包装进以太网包的数据部分中,委托以太网去传输这些数据。IP协议本身没有传输包的功能,因此包的实际传输要委托以太网来进行。

    路由器是基于IP设计的,而交换机是基于以太网设计的,因此IP与以太网的关系也就是路由器与交换机的关系。

    简单来说,IP (路由器)负责将包发送给通信对象这一整体过程,而其中将包传输到下一个路由器的过程则是由以太网(交换机)来负责的。

    4. 路由器的附加功能

    通过地址转换有效利用IP地址

    在内网中可用作私有地址的范围仅限以下这些:

    10.0.0.0 ~ 10.255.255.255
    172.16.0.0 ~ 172.31.255.255
    192.168.0.0 ~ 192.168.255.255
    

    当公司内网和互联网连接的时候,需要将公司内网分成两个部分,一部分是对互联网开放的服务器,另一部分是公司内部设备。

    其中对互联网开放的部分分配公有地址,可以和互联网直接进行通信。相对地,内网部分则分配私有地址,内网中的设备不能和互联网直接收发网络包,而是通过一种特别的机制进行连接,这个机制就叫地址转换。

    地址转换的基本原理

    地址转换的基本原理是在转发网络包时对IP头部中的IP地址和端口号进行改写。

    现在我们使用的地址转换机制是同时改写地址和端口号的,为了提高公有地址的利用率。

    从互联网访问公司内网

    除非公司主动允许,否则是无法从互联网向公司内网发送网络包的。这种机制具有防止非法入侵的效果。

    只要事先将地址和端口的关联信息添加到地址转换设备的对应表中,就可以从互联网访问内网中的设备了。

    路由器的包过滤功能

    包过滤就是在对包进行转发时,根据MAC头部、IP头部、TCP头部的内容,按照事先设置好的规则决定是转发这个包,还是丢弃这个包。

    我们通常说的防火墙设备或软件,大多数都是利用这一机制来防止非法入侵的。

    第四章 通过接入网进入互联网内部

    1. ADSL接入网的结构和工作方式

    和家庭、公司网络一样,互联网也是通过路由器来转发包的,而且路由器的基本结构和工作方式也并没有什么不同。因此,我们可以将互联网理解为家庭、公司网络的一个放大版。

    距离的不同和路由的维护方式,就是互联网与家庭、公司网络之间最主要的两个不同点。

    互联网接入路由器发送网络包的操作和以太网路由器有一点不同,互联网接入路由器是按照接入网规则来发送包的。

    所谓接入网,就是指连接互联网与家庭、公司网络的通信线路。一般家用的接入网方式包括ADSL、FTTH、CATV、电话线、ISDN等.

    互联网接入路由器会在网络包前面加上MAC头部、PPPoE头部、PPP头部总共3种头部,然后发送给ADSL Modem (PPPoE方式下)。

    ADSL Modem将包拆分成信元,并转换成电信号发送给分离器。

    ADSL Modem采用了一种用圆滑波形(正弦波)对信号进行合成来表示0和1的技术,这种技术称为调制。

    调制有很多方式,ADSL采用的调制方式是振幅调制(ASK)和相位调制(PSK)相结合的正交振幅调制(QAM)方式。

    ADSL通过使用多个波来提高速率

    ADSL通过多个波增加能表示的比特数来提高速率的。

    ADSL技术中,上行方向(用户到互联网)和下行方向(互联网到用户)的传输速率是不同的,原因也在这里。如果上行使用26个频段,下行则可以使用95个或者223个频段,波的数量不同,导致了上下行速率不同。

    分离器的作用

    ADSL Modem将信元转换为电信号之后,信号会进入一个叫作分离器的设备,然后ADSL信号会和电话的语音信号混合起来一起从电话线传输出去。

    通过分离器将传入的信号分离,以确保ADSL信号不会传入电话机。具体来说,分离器的功能是将一定频率以上的信号过滤掉,也就是过滤掉了ADSL使用的高频信号,这样一来,只有电话信号才会传入电话机。

    从用户到电话局

    从分离器出来,就是插电话线的接口,信号从这里出来之后,会通过室内电话线,然后到达大楼的IDF和MDF,外面的电话线在这里和大楼内部的室内电话线相连接。

    通过配线盘之后,信号会到达保安器。

    保安器是为了防止雷电等情况下电话线中产生过大电流的一种保护装置,内部有保险丝。

    接下来,信号会进入电线杆上架设的电话电缆。

    在电话局附近,电话线都是埋在地下的。

    由于电话局附近的地下电缆很多,集中埋设电缆的地方就形成了一条地道,这部分称为电缆隧道。

    通过电缆隧道进入电话局后,电缆会逐根连接到电话局的MDF上。

    通过DSLAM到达BAS

    信号通过电话线到达电话局之后,会经过配线盘、分离器到达DSLAM。在这里,电信号会被还原成数字信息——信元。

    信元从DSLAM出来之后,会到达一个叫作BAS的包转发设备。

    BAS和DSLAM一样,都具有ATM接口,可以接收ATM信元,还可以将接收到的ATM信元还原成原始的包。

    BAS负责将ATM信元还原成网络包并转发到互联网内部。

    2. 光纤接入网(FTTH)

    ...

    4. 跨越运营商的网络包

    互联网内部使用BGP机制在运营商之间交换路由信息。

    第五章 服务器端的局域网中有什么玄机

    2. 防火墙的结构和原理

    防火墙的基本思路:即只允许发往特定服务器中的特定应用程序的包通过,然后屏蔽其他的包。

    包过滤方式的防火墙可根据接收方IP地址、发送方IP地址、接收方端口号、发送方端口号、控制位等信息来判断是否允许某个包通过。

    3. 通过将请求平均分配给多台服务器来平衡负载

    DNS 轮询

    当访问服务器时,客户端需要先向DNS服务器查询服务器的IP地址,如果在DNS服务器中填写多个名称相同的记录,则每次查询时DNS服务器都会按顺序返回不同的IP地址。

    负载均衡器

    用于对多台Web服务器分配访问的负载均衡器:

    负载均衡器就可以通过这些信息来作出判断,将一系列相关的请求发送到同一台Web服务器,对于不相关的请求则发送到负载较低的服务器了。

    4. 使用缓存服务器分担负载

    缓存服务器是一台通过代理机制对数据进行缓存的服务器。

    代理介于Web服务器和客户端之间,具有对Web服务器访问进行中转的功能。当进行中转时,它可以将Web服务器返回的数据保存在磁盘中,并可以代替Web服务器将磁盘中的数据返回给客户端。

    存服务器和负载均衡器一样,需要代替Web服务器被注册到DNS服务器中。

    第六章 请求到达web服务器,响应返回浏览器

    通过客户端IP地址、客户端端口号、服务器IP地址、服务器端口号这4种信息可以确定某个套接字。

    使用描述符来指代套接字的原因如下。(1)等待连接的套接字中没有客户端IP地址和端口号(2)使用描述符这一种信息比较简单。

    2. 服务器的接受操作

    1. 服务器将接收到的电信号还原为数字信息(网卡)。

    网卡的 MAC 模块将网络包从信号还原为数字信息,校验FCS并存入缓冲区。

    网卡驱动会根据MAC头部判断协议类型,并将包交给相应的协议栈。

    1. 协议栈的IP模块会检查IP头部,(1)判断是不是发给自己的;(2)判断网络包是否经过分片;(3)将包转交给TCP模块或UDP模块。

    2. 如果收到的是发起连接的包,则TCP模块会(1)确认TCP头部的控制位SYN; (2)检查接收方端口号;(3)为相应的等待连接套接字复制一个新的副本;(4)记录发送方IP地址和端口号等信息。

    3. 收到数据包时,TCP模块会(1)根据收到的包的发送方IP地址、发送方端口号、接收方IP地址、接收方端口号找到相对应的套接字;(2)将数据块拼合起来并保存在接收缓冲区中;(3)向客户端返回ACK。

    每天学习一点点,每天进步一点点。

  • 相关阅读:
    Linux文件查询笔记
    C语言学习和回顾
    hive的数据压缩
    进程线程那些事儿
    hive的数据存储格式
    hive的内置函数
    Hive自定义函数
    spark编译
    Impala的安装和使用
    数据库的读写分离
  • 原文地址:https://www.cnblogs.com/youcoding/p/15191141.html
Copyright © 2011-2022 走看看