2-4小时突击计算机网络(2)

本节内容:套接字、收发操作、断开并删除套接字、IP与以太网的包收发操作、UDP协议的收发操作

本节TCP/IP和UDP的知识点是重点内容,面试经常提问!!!

创建套接字

协议栈的内部结构

TCP/IP软件采用的分层结构

       像浏览器、邮件等一般的应用程序都是使用 TCP 收发数据的,而像 DNS 查询等收发较短的控制数据的时候则使用 UDP。

       下面一半是用 IP 协议控制网络包收发操作的部分。在互联网上传送数据时,数据会被切分成一个一个的网络包 A,而将网络包发送给通信对象的操作就是由 IP 来负责的。此外,IP 中还包括 ICMP协议和 ARP协议。ICMP 用于告知网络包传送过程中产生的错误以及各种控制消息,ARP 用于根据 IP 地址查询相应的以太网 MAC 地址。

套接字的实体就是通信控制信息

       协议栈是根据套接字中记录的控制信息来工作的。(套接字中必须要记录是否已经收到响应,以及发送数据后经过多长时间,才能根据这些信息按照需要执行重发操作)

显示套接字内容

调用socket时的操作

       创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态。

消息收发操作

连接服务器

       连接操作的目的:需要把服务器的IP地址和端口号等信息告知协议栈,其二客户端向服务器传达开始通信的请求。

负责保存控制信息的头部

       TCP协议规格中定义了控制信息。这些字段是固定的,在连接、收发、断开等各个阶段中,每次客户端和服务器之间进行通信时,都需要提供这些控制信息。

TCP头部格式

客户端与服务器之间交换的控制信息

连接操作的实际过程

       connect(< 描述符 >, < 服务器 IP 地址和端口号 >, …)

       上面的调用提供了服务器的IP地址和端口号,这些信息会传递给协议栈中的TCP模块。然后,TCP 模块会与该 IP 地址对应的对象,也就是与服务器的 TCP 模块交换控制信息。

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

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

       当 TCP 头部创建好之后,接下来 TCP 模块会将信息传递给 IP 模块并委托它进行发送。IP 模块执行网络包发送操作后,网络包就会通过网络到达服务器,然后服务器上的IP 模块会将接收到的数据传递给TCP 模块,服务器的 TCP 模块根据 TCP 头部中的信息找到端口号对应的套接字,也就是说,从处于等待连接状态的套接字中找到与 TCP 头部中记录的端口号相同的套接字就可以了。当找到对应的套接字之后,套接字中会写入相应的信息,并将状态改为正在连接。上述操作完成后,服务器的 TCP 模块会返回响应,这个过程和客户端一样,需要在 TCP 头部中设置发送方和接收方端口号以及 SYN 比特。此外,在返回响应时还需要将 ACK 控制位设为1,这表示已经接收到相应的网络包。网络中经常会发生错误,网络包也会发生丢失,因此双方在通信时必须相互确认网络包是否已经送达,而设置ACK 比特就是用来进行这一确认的。接下来,服务器 TCP 模块会将 TCP头部传递给 IP 模块,并委托 IP 模块向客户端返回响应。

       然后,网络包就会返回到客户端,通过 IP 模块到达 TCP 模块,并通过 TCP 头部的信息确认连接服务器的操作是否成功。如果 SYN 为 1 则表示连接成功,这时会向套接字中写入服务器的 IP 地址、端口号等信息,同时还会将状态改为连接完毕。到这里,客户端的操作就已经完成,但其实还剩下最后一个步骤。刚才服务器返回响应时将 ACK 比特设置为 1,相应地,客户端也需要将 ACK 比特设置为 1 并发回服务器,告诉服务器刚才的响应包已经收到。当这个服务器收到这个返回包之后,连接操作才算全部完成。

收发数据

将HTTP请求消息交给协议栈

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

       首先,协议栈并不关心应用程序传来的数据是什么内容的。其次,协议栈并不是一收到数据就马上发送出去。第一个判断得要素是每个网络包能容纳得数据长度,协议栈会根据一个叫作MTU得参数来进行判断。另一个判断要素是时间,协议栈得内部有一个计时器,当经过一定时间之后,就会把网络包发送出去。

       MTU一个网络包得最大长度,以太网中一般为1500字节。

       MSS除去头部之后,一个网络包所能容纳得TCP数据的最大长度。

MTU与MSS

对较大的数据进行拆分

       发送缓冲区中的数据就会超过MSS的长度,发送缓冲区中的数据会被以MSS长度为单位进行拆分,拆分出来的每块数据会被放进单独的网络包中。

       根据发送缓冲区中的数据拆分的情况,当判断需要发送这些数据时,就在每一块数据前面加上 TCP 头部,并根据套接字中记录的控制信息标记发送方和接收方的端口号,然后交给 IP 模块来执行发送数据的操作

应用程序数据的拆分发送

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

       发送数据的长度也需要告知接收方,不过这个并不是放在TCP 头部里面的,因为用整个网络包的长度减去头部的长度就可以得到数据的长度,所以接收方可以用这种方法来进行计算。

       此需要在开始收发数据之前将初始值告知通信对象。连接过程中,有一个将 SYN 控制位设为1 并发送给服务器的操作,就是在这一步将序号的初始值告知对方的。实际上,在将SYN 设为 1 的同时,还需要同时设置序号字段的值,而这里的值就代表序号的初始值。

序号和ACK号的用法

       首先,客户端在连接时需要计算出与从客户端到服务器方向通信相关的序号初始值,并将这个值发送给服务器(图 2.9 ①)。接下来,服务器会通过这个初始值计算出ACK 号并返回给客户端(图 2.9②)。初始值有可能在通信过程中丢失,因此当服务器收到初始值后需要返回 ACK 号作为确认。同时,服务器也需要计算出与从服务器到客户端方向通信相关的序号初始值,并将这个值发送给客户端(图 2.9 ②)。接下来像刚才一样,客户端也需要根据服务器发来的初始值计算出 ACK 号并返回给服务器(图 2.9③)。到这里,序号和 ACK号都已经准备完成了,接下来就可以进入数据收发阶段了。数据收发操作本身是可以双向同时进行的,但 Web 中是先由客户端向服务器发送请求,序号也会跟随数据一起发送(图 2.9 ④)。然后,服务器收到数据后再返回 ACK 号(图 2.9 ⑤)。从服务器向客户端发送数据的过程则正好相反(图 2.9 ⑥⑦)。

图2.9 序号和ACK号交互

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

       TCP 采用了动态调整等待时间的方法,这个等待时间是根据 ACK 号返回所需的时间来判断的。具体来说,TCP 会在发送数据的过程中持续测量 ACK 号的返回时间,如果 ACK 号返回变慢,则相应延长等待时间;相对地,如果 ACK 号马上就能返回,则相应缩短等待时间。

使用窗口有效管理ACK号

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

一来一回方式和滑动窗口方式

       这样有可能会出现发送包的频率超过接收方处理能力的情况。当接收方的 TCP 收到包后,会先将数据存放到接收缓冲区中。然后,接收方需要计算 ACK 号,将数据块组装起来还原成原本的数据并传递给应用程序,如果这些操作还没完成下一个包就到了也不用担心,因为下一个包也会被暂存在接收缓冲区中。如果数据到达的速率比处理这些数据并传递给应用程序的速率还要快,那么接收缓冲区中的数据就会越堆越多,最后就会溢出。

       滑动窗口。当接收操作完成后,接收缓冲区中的空间会被释放出来,也就可以接收更多的数据了,这时接收方会通过 TCP 头部中的窗口字段将自己能接收的数据量告知发送方。

滑动窗口与接收缓冲区

ACK和窗口合并

     接收方在发送 ACK 号和窗口更新时,并不会马上把包发送出去,而是会等待一段时间,在这个过程中很有可能会出现其他的通知操作,这样就可以把两种通知合并在一个包里面发送了。举个例子,在等待发送ACK 号的时候正好需要更新窗口,这时就可以把 ACK 号和窗口更新放在一个包里发送,从而减少包的数量。当需要连续发送多个 ACK 号时,也可以减少包的数量,这是因为 ACK 号表示的是已收到的数据量,也就是说,它是告诉发送方目前已接收的数据的最后位置在哪里,因此当需要连续发送 ACK 号时,只要发送最后一个 ACK 号就可以了,中间的可以全部省略。当需要连续发送多个窗口更新时也可以减少包的数量,因为连续发生窗口更新说明应用程序连续请求了数据,接收缓冲区的剩余空间连续增加。这种情况和 ACK 号一样,可以省略中间过程,只要发送最终的结果就可以了。

接受HTTP响应消息

发送HTTP请求消息后,接下来还需

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏主要是介绍嵌入式软件开发岗位的相关知识和学习攻略,为大家提供一份笔试与面试手册。包括有嵌入式软件开发岗位介绍与学习攻略;校园招聘和offer疑惑问题的介绍;在笔试方面,如何刷题为笔试作准备,提供往年笔试真题;在面试方面,提供相关知识的复习重点,提供面试真题。包括有:华为、蔚来、文远、大疆、三一、深信服、亚马逊、Intel、百度、科大讯飞、OPPO、京东、中兴、比特大陆|算能、美团等等

全部评论

相关推荐

头像
10-15 22:27
已编辑
门头沟学院 C++
罗格镇的小镇做题家:我投了hr打电话来说学历太低了不符合要求,建议投荣耀,结果荣耀也投了一定水花没有,非本211硕
投递华为等公司10个岗位
点赞 评论 收藏
分享
最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
3 7 评论
分享
牛客网
牛客企业服务