所给服务器端程序改写为能够同时响应多个客户端连接请求的服务器程序_一文读懂客户端请求是如何到达服务器的...

点击上方“蓝色字体”,选择 “设为星标”

关键讯息,D1时间送达!

a28f4bc142113576253ada76bb66b3bf.png

互联网是人类历史上最伟大的发明创造之一,而构成互联网架构的核心在于TCP/IP协议。那么TCP/IP是如何工作的呢,我们先从数据包开始讲起。

1、数据包

一、HTTP请求和响应步骤

3c411e5d3c9f877591f807d7ddf51d80.png

http请求全过程

c785074885b9007ebb18620e22a5e6eb.png

请求

7a6b1717d64a2037463751cf24c9cec3.png

响应

以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。

2、TCP/IP概述

我们以RFC 1180中的图作为参考

30ae262fd0c25d45a1a6ead68990d05e.png

上图展示了四层TCP/IP协议图,其中network applications是应用程序,属于应用层;TCP和UDP主要是传输数据,属于传输层,TCP确保端对端的可靠传输并尽量确保网络健康运行,而UDP是简单不可靠传输;IP主要解决路由问题,属于网络层;ARP是网络地址转换,主要用来转换IP地址和MAC地址,介于数据链路层和网络层之间,可以看成2.5层;ENET在这里是数据链路层,网卡驱动属于这一层,主要做具体的介质传输,前面示例中的广告请求抓包就是在数据链路层抓取。

值得注意的是,ARP在linux系统里属于网络层,而在RFC里是介于数据链路层和网络层之间。在《TCP/IP详解》一书里,ARP被放到了数据链路层。当解决实际问题的时候,我们应该把ARP放到网络层。

604e5fce371b4f516249f64ae2f95d56.png

上图给出使用TCPCopy在不同层发包的使用方法。如果TCPCopy从数据链路层发包,由于没有享受到ARP服务,用户需要在使用TCPCopy的时候额外加上MAC地址;而如果TCPCopy从IP层发包,则无需指定MAC地址。

本课程主要讲述TCP相关案例,没有特殊说明的话,TCP特指传输层的TCP。

3、什么是TCP

TCP即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。TCP的主要工作是定义端口标识应用程序的身份,实现端对端的可靠通信,并进行拥塞控制,防止互联网崩塌。

TCP有如下关键特性:

992084e390939d6f2462061afe1a5ee8.png

由于TCP是面向连接的协议,所以是一种有状态的协议,而有状态的协议往往比较复杂,因此TCP学习起来也比较困难。

通过状态图来查看一下TCP状态的复杂性:

d30b08742bf24e4e7cc2f2ca3bb8dc70.png

上图展示了错综复杂的TCP状态图,然而现实更加复杂。

现实中的TCP状态图其实是这样的:

9e0443ca5738df062af7f6129c56cf29.png

图中,不仅SYN_RCVD状态能够收到reset数据包(图中RST,reset数据包是重置连接的数据包,可以使TCP状态瞬间变为CLOSED状态,而CLOSED状态是无法追踪的),而且FIN_WAIT1、FIN_WAIT2、ESTABLISHED、SYN_SENT和CLOSE_WAIT都能被reset数据包打回到CLOSED状态。不仅如此,TCP状态还受到超时的影响。例如Linux系统,一旦连接处于FIN_WAIT_2,在60秒内(默认)如果没有接收到对端的FIN数据包,系统会把此连接状态FIN_WAIT_2直接变到CLOSED状态。虽然Linux这样做是为了防止攻击,但这种超时就干掉连接状态的做法,很可能误杀了很多正常连接,从而使问题更加捉摸不定。

在互联网领域,很多诡异的问题跟TCP状态有关系,课程后续会有较多案例来讲述这些灵异问题。

4、端口

当我们去连接服务器程序时,需要指明服务器端口。为什么需要端口呢?因为系统是通过端口来区分不同应用程序,TCP通过端口找到上层应用。

需要注意的是,端口号是有限的,端口号最大为65535,能够利用的端口数量随配置而定。例如在压力测试过程中,一台机器可以利用的TCP端口是有限的,能够利用的连接(客户端端口,客户端IP,服务器应用端口,服务器IP地址)是有限的。为了解决这个问题,可以配置多IP地址来扩大可用连接数量。系统支持同一个端口,不同的IP地址来绑定不同的应用。Linux高版本系统下,在绑定同一个IP地址的情况下,我们还可以利用REUSEPORT机制使不同应用程序共享同一个监听端口,这对高性能服务器开发是非常有用的。我们开发的数据库中间件cetus就利用这个机制来解决短链接风暴的问题。

5、IP

网络层的主要工作是定义网络地址,区分网段,子网内MAC寻址,对不同子网的数据包进行路由。IP的主要作用就是在复杂的网络环境中将数据包发给最终的目标地址。

IP是面向无连接的,是无状态的协议。IP为什么被设计成无状态呢?

1. 无状态协议处理简单

2. 通信之前无需建立连接

3. TCP已经面向连接服务了,IP层可以委托TCP来解决面向连接的问题

4. 由于不带有状态,互联网路由起来更加自由,容错性也更强

值得注意的是,现实中的IP层往往都带有安全过滤,甚至有些路由器,防火墙等中途设备还会干涉应用(例如通过reset数据包来干涉TCP会话),为了更好的做安全检测,IP层还增加了connection tracking,在无状态协议上面来追踪上层连接。这种方式提高了安全性,但有时也会带来新的问题,我们后面有案例具体讲述connnection tracking带来的坑的故事。

6、TCP Socket

应用程序通过TCP socket接口来调用TCP服务,从而达到传递数据的目的。每一个TCP socket会被绑定到一个端口,TCP socket双向都可以通信,在发送数据的同时,还可以接收数据。

值得注意的是,应用程序发送完数据,只代表通过TCP socket委托给TCP的工作已经完成,不代表发送给对端完毕,应用发送数据和TCP传输数据不是同步的。

7、How TCP/IP Works

当用户通过TCP socket接口发送请求后,TCP协议模块接管了请求传递,TCP先把请求拆分成一个个更小的数据分段(假设TCP offload没有开启的情况下),通过IP层发送出去。在IP层,这些数据分段会被封装成IP数据包,通过数据链路层发送给互联网(见下图)。这些数据包经过互联网的多个路由器到达目的地。由于IP网络是无状态的协议,每一个数据包走的路径可能不一样,而且到达的顺序也有可能不一样,这就要求对端的TCP需要重新组装数据包,以确保向应用层传递的数据是用户能够识别的用户请求,这样服务器应用程序就可以处理用户发起的请求了。

3d313c6559ecb63d5c14aaaf912b221f.png

下图中,假设用户请求拆分成两个IP数据包

6933ba4ae75e0b9af88244205f58e6dc.png

第一个IP数据包可能经过A,B,C,G,如下图。

ca02f83b7fb34f2a0627c2f6a346a467.png

第二个数据包可能经过A,B,E,G(在B点选择了E节点,导致路径不同),如下图。

f71c405ce882cd910854fdc6b73846b7.png

导致数据包在B节点走向不同路径的原因可能有很多种,例如C节点暂时不如E节点通畅或者临时发生了网络拥塞,这与在高速道路驾驶的原理差不多。

由于网络环境多变,还可能第二个数据包先到达服务器,这时TCP会负责处理out of order的情况;如果网络传递过程中,某一个路由器由于过于繁忙,把第一个数据包丢了,那么客户端的TCP会负责重传第一个数据包,确保服务器端的TCP能够不会因为丢包而收不到第一个数据包。

如果用户请求内容很大,如上传一个大文件,就会被拆分成大量数据分段,而TCP传输这些数据分段的时候,往往还会考虑整个互联网能够接收的程度和对方能够接收的程度,发送数据过于贪婪不仅会连累整个互联网,对方也未必能够接收得了,而且还可能使自己速度更慢,这有点像道路驾驶一样,不能过于自私,遵守一定的交通规则才能使道路通畅。在互联网传输数据方面,这些交通规则算法就是赫赫有名的网络拥塞控制算法,而对方能否接收得了,则通过发送窗口的方式进行控制。总体来说,一次发送数据的大小是根据对方的接收窗口大小和拥塞控制算法来综合决定的。

从上面可以看出,IP负责在互联网传输数据,而TCP负责数据传输可靠并且尽量使网络健康运行,两者合作完成了请求的传递,这也是互联网应用工作的普遍方式。

需要注意的是,TCP负责跟TCP进行交互,应用层无需去实现TCP的功能,只需要委托给TCP来完成数据传输,这种隔离的方式给应用层的开发/运维/测试带来了方便,另外,当出现TCP相关问题时,解决问题的难度也大大增加。

8、TCP经验知识

在多年实战过程中,我们发现以下TCP经验对工作很有帮助。总结如下:

1. 距离越远,延迟越大,重传概率越大

2. 网络状况好坏,直接影响应用程序性能

3. 不同环境,采用不同的拥塞算法

4. 拥塞控制算法是互联网的精华,是互联网大获成功的关键因素之一

5. TCP是有状态协议,采用异步处理

6. 抓包分析是找到TCP相关问题根本原因的利器

7. TCP客户端和TCP服务器端之间的交互,是应用层所有应用公共的交互部分,理解了这部分原理,可以解决大量TCP相关问题。

9、IP经验知识

在IP经验知识方面,我们大致总结如下:

1. 数据包选择路径不是固定的,到达的顺序也可能是乱序的

2. 安全过滤,坑多的地方

3. 无状态协议,简化互联网架构,是互联网大获成功的关键因素之一

4. IP层对TCP传递过来的数据包很少分片处理

5. 中途设备不仅仅具备路由功能,而且还会干涉TCP会话(灵异问题的温床)

10、结束语

TCP/IP网络是互联网的基石,了解TCP/IP是如何工作的,对于我们解决问题是非常有帮助的。

(来源:架构师之路)

如果您在企业IT、网络、通信行业的某一领域工作,并希望分享观点,欢迎给企业网D1Net投稿e8996646564cc050397b5e440788b199.png 投稿邮箱:editor@d1net.com

点击蓝色字体e0dbfa0d8af0ed8619865767280d7a47.png关注

您还可以搜索公众号“D1net”选择关注D1net旗下的各领域(云计算,数据中心,大数据,CIO, 企业通信 ,企业应用软件,网络数通,信息安全,服务器,存储,AI人工智能,物联网智慧城市等)的子公众号。

企业网D1net已推出企业应用商店(www.enappstore.com),面向企业级软件,SaaS等提供商,提供陈列,点评功能,不参与交易和交付。现可免费入驻,入驻后,可获得在企业网D1net 相应公众号推荐的机会。欢迎入驻。扫描下方“二维”即可注册,注册后读者可以点评,厂商可以免费入

dc3c44b0f6ff18da6fc87303ea1a4415.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消息服务器 推送技术,SSE服务器推送技术

SSE即 server send event 服务器发送事件,在在早期可能会使用ajax向服务器轮询的方式,使浏览器第一时间接受到服务器的消息,但这种频率不好控制,消耗也比较大。但是对于SSE来说,当客户端向服务端发送请求,服…

Contest2162 - 2019-3-28 高一noip基础知识点 测试5 题解版

传送门 T1 单调栈 按照b排序 在家每一个物品时,判断一下a和b的关系 如果s[sta[top]].a>s[i].b,就弹栈 记录所有时候的height,并取最大值 T2 单调栈裸题 单调栈是干什么的?? 单调栈是记录一个数的一侧的第一个比他大…

在package.json里面的script设置环境变量,区分开发及生产环境。注意mac与windows的设置方式不一样...

在package.json里面的script设置环境变量,区分开发及生产环境。 注意mac与windows的设置方式不一样。 "scripts": {"publish-mac": "export NODE_ENVprod&&webpack -p --progress --colors","publish-win": "…

leetcode 978. 最长湍流子数组(动态规划)

978. 最长湍流子数组 当 A 的子数组 A[i], A[i1], …, A[j] 满足下列条件时&#xff0c;我们称其为湍流子数组&#xff1a; 若 i < k < j&#xff0c;当 k 为奇数时&#xff0c; A[k] > A[k1]&#xff0c;且当 k 为偶数时&#xff0c;A[k] < A[k1]&#xff1b; 或 …

人工智能取代工作_人工智能正在取代人们的工作-开发人员是下一个吗?

人工智能取代工作I was recently asked to comment on whether there was any point in becoming a developer right now, because AI might be doing your job very soon.最近有人要求我评论一下现在成为开发人员是否有任何意义&#xff0c;因为AI可能很快就会完成您的工作。 …

python类self_Python类中的self到底是干啥的

Python编写类的时候&#xff0c;每个函数参数第一个参数都是self&#xff0c;一开始我不管它到底是干嘛的&#xff0c;只知道必须要写上。后来对Python渐渐熟悉了一点&#xff0c;再回头看self的概念&#xff0c;似乎有点弄明白了。首先明确的是self只有在类的方法中才会有&…

PHP中关于取模运算及符号

执行程序段<?php echo 8%(-2) ?>&#xff0c;输出结果是&#xff1a; %为取模运算&#xff0c;以上程序将输出0 $a%$b,其结果的正负取决于$a的符号。 echo ((-8)%3); //将输出-2 echo (8%(-3)); //将输出2转载于:https://www.cnblogs.com/457248499-qq-com/p…

[pytorch] Pytorch入门

Pytorch入门 简单容易上手&#xff0c;感觉比keras好理解多了&#xff0c;和mxnet很像&#xff08;似乎mxnet有点借鉴pytorch&#xff09;&#xff0c;记一记。 直接从例子开始学&#xff0c;基础知识咱已经看了很多论文了。。。 import torch import torch.nn as nn import to…

无线服务器密码让别人改了,wifi密码被改了怎么办_wifi密码被别人改了怎么办?-192路由网...

wifi密码被别人改了怎么办&#xff1f;wifi密码之所以被别人修改&#xff0c;是因为其他人知道了你路由器的登录密码。所以&#xff0c;如果发现自己wifi密码被别人修改了&#xff0c;应该立刻登录到路由器设置界面&#xff0c;修改路由器登录密码、修改wifi密码、并调整wifi加…

[archlinux][hardware] 查看SSD的使用寿命

因为最近把16GB的SSD做成了HDD的cache&#xff0c;所以比较关系寿命问题。 使用smartctl工具。 参考&#xff1a;https://www.v2ex.com/t/261373 linux 下面只有 smartmontools 这一个工具&#xff0c;而且只对像三丧和 intel 这样的大厂支持良好&#xff0c;其余的厂家文档不全…

leetcode174. 地下城游戏(动态规划)

一些恶魔抓住了公主&#xff08;P&#xff09;并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士&#xff08;K&#xff09;最初被安置在左上角的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正…

如何设置Windows版Go —快速简便的指南

by Linda Gregier琳达格雷格(Linda Gregier) Another great language to add to your full-stack developer tool belt is the simple and productive general-purpose programming language of Go.添加到您的全栈开发人员工具带中的另一种很棒的语言是Go的简单而高效的通用编…

python计算现场得分_浅谈用 Python 计算文本 BLEU 分数

浅谈用 Python 计算文本 BLEU 分数BLEU, 全称为 Bilingual Evaluation Understudy(双语评估替换), 是一个比较候选文本翻译与其他一个或多个参考翻译的评价分数尽管 BLEU 一开始是为翻译工作而开发, 但它也可以被用于评估文本的质量, 这种文本是为一套自然语言处理任务而生成的…

Unity的几个特殊文件夹

1.以.开头的文件夹会被unity忽略&#xff0c;资源不会被导入&#xff0c;脚本不会编译。 2.Standard Assets和Pro Standard Assets&#xff1a;在这个文件夹中的脚本最先被编译。 3.Editor&#xff1a;以Editor命名的文件夹允许其中的脚本访问Unity Editor的API。如果脚本中使用…

怎么上传文件到kk服务器,VS Code 关于SFTP上传文件到多服务器的配置

工欲善其事&#xff0c;必先利其器&#xff01;刚学前端的时候一直用的DW来编写代码&#xff0c;其功能非常强大&#xff0c;但在Linux下不能用&#xff0c;所以就转VS Code了。但是刚开始使用VS Code的时候&#xff0c;很多DW上的功能需要自己安装扩展&#xff0c;并配置才可以…

CentOS7 Firewall NAT 及端口映射

本节介绍用CentOS7的Firewalll来做NAT以及端口映射实验拓扑:因为我的环境里CentOS7上有KVM虚拟机需要共享网卡上网&#xff0c;所以我把网卡都添加到了桥里面&#xff0c;当然这里也可以不用桥&#xff0c;直接用物理网口&#xff1b;用nmcli创建桥&#xff0c;并添加网口到桥&…

JVM源码---教你傻瓜式编译openjdk7(JAVA虚拟机爱好者必看)

LZ经过一个星期断断续续的研究&#xff0c;终于成功的搞定了JDK的成功编译与调试。尽管网络上的教程也有不少&#xff0c;包括源码中也有自带的编译步骤说明&#xff0c;但真正自己动手的话&#xff0c;还是会遇到不少意料之外的错误。 为了方便各位猿友编译&#xff0c;LZ临时…

leetcode1105. 填充书架(动态规划)

附近的家居城促销&#xff0c;你买回了一直心仪的可调节书架&#xff0c;打算把自己的书都整理到新的书架上。 你把要摆放的书 books 都整理好&#xff0c;叠成一摞&#xff1a;从上往下&#xff0c;第 i 本书的厚度为 books[i][0]&#xff0c;高度为 books[i][1]。 按顺序 将…

python 微信bot_使用Tweepy在Python中创建Twitter Bot

python 微信botby Lucas Kohorst卢卡斯科斯特(Lucas Kohorst) 使用Tweepy在Python中创建Twitter Bot (Create a Twitter Bot in Python Using Tweepy) With about 15% of Twitter being composed of bots, I wanted to try my hand at it. I googled how to create a Twitter …

第五周学习进度

1.学习所花时间&#xff1a;单纯Java是12个小时左右&#xff1b; 2.代码量&#xff1a;大约300行&#xff1b; 3.博客量&#xff1a;1篇。 4.了解到的知识点&#xff1a;数据库语言的增删改查 5.下周计划除了掌握课上知识外&#xff0c;还要再复习之前的关于Java的相关知识点。…