
在TCP/IP协议中,通过(C、IP地址+端口号)来区分不同的连接。
TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。
扩展资料:
应用层、表示层、会话层三个层次提供的服务相差不是很大,所以在TCP/IP协议中,它们被合并为应用层一个层次。
由于运输层和网络层在网络协议中的地位十分重要,所以在TCP/IP协议中它们被作为独立的两个层次。
因为数据链路层和物理层的内容相差不多,所以在TCP/IP协议中它们被归并在网络接口层一个层次里。只有四层体系结构的TCP/IP协议,与有七层体系结构的OSI相比要简单了不少,也正是这样,TCP/IP协议在实际的应用中效率更高,成本更低。
tcp 协议 是互联网中最常用的协议 , 开发人员基本上天天和它打交道,对它进行深入了解。 可以帮助我们排查定位bug和进行程序优化。下面我将就TCP几个点做深入的探讨
客户端:收到 ack 后 分配连接资源。 发送数据
服务器 : 收到 syn 后立即 分配连接资源
客户端:收到ACK, 立即分配资源
服务器:收到ACK, 立即分配资源
既然三次握手也不是100%可靠, 那四次,五次,六次。。。呢 其实都一样,不管多少次都有丢包问题。
client 只发送一个 SYN, server 分配一个tcb, 放入syn队列中。 这时候连接叫 半连接 状态;如果server 收不到 client 的ACK, 会不停重试 发送 ACK-SYN 给client 。重试间隔 为 2 的 N 次方 叠加(2^0 , 2^1, 2^2 );直至超时才释放syn队列中的这个 TCB;
在半连接状态下, 一方面会占用队列配额资源,另一方面占用内存资源。我们应该让半连接状态存在时间尽可能的小
当client 向一个未打开的端口发起连接请求时,会收到一个RST回复包
当listen 的 backlog 和 somaxconn 都设置了得时候, 取两者min值
Recv-Q 是accept 队列当前个数, Send-Q 设置最大值
这种SYN洪水攻击是一种常见攻击方式,就是利用半连接队列特性,占满syn 队列的 资源,导致 client无法连接上。
解决方案:
为什么不像握手那样合并成三次挥手 因为和刚开始连接情况,连接是大家都从0开始, 关闭时有历史包袱的。server(被动关闭方) 收到 client(主动关闭方) 的关闭请求FIN包。 这时候可能还有未发送完的数据,不能丢弃。 所以需要分开。事实可能是这样
当然,在没有待发数据,并且允许 Delay ACK 情况下, FIN-ACK合并还是非常常见的事情,这是三次挥手是可以的。
同上
CLOSE_WAIT 是被动关闭方才有的状态 。
被动关闭方 [收到 FIN 包 发送 ACK 应答] 到 [发送FIN, 收到ACK ] 期间的状态为 CLOSE_WAIT, 这个状态仍然能发送数据。 我们叫做 半关闭 , 下面用个例子来分析:
这个是我实际生产环境碰到的一个问题,长连接会话场景,server端收到client的rpc call 请求1,处理发现请求包有问题,就强制关闭结束这次会话, 但是 因为client 发送 第二次请求之前,并没有去调用recv,所以并不知道 这个连接被server关闭, 继续发送 请求2 , 此时是半连接,能够成功发送到对端机器,但是recv结果后,遇到连接已经关闭错误。
如果 client 和 server 恰好同时发起关闭连接。这种情况下,两边都是主动连接,都会进入 TIME_WAIT状态
1、 被动关闭方在LAST_ACK状态(已经发送FIN),等待主动关闭方的ACK应答,但是 ACK丢掉, 主动方并不知道,以为成功关闭。因为没有TIME_WAIT等待时间,可以立即创建新的连接, 新的连接发送SYN到前面那个未关闭的被动方,被动方认为是收到错误指令,会发送RST。导致创建连接失败。
2、 主动关闭方断开连接,如果没有TIME_WAIT等待时间,可以马上建立一个新的连接,但是前一个已经断开连接的,延迟到达的数据包。 被新建的连接接收,如果刚好seq 和 ack字段 都正确, seq在滑动窗口范围内(只能说机率非常小,但是还是有可能会发生),会被当成正确数据包接收,导致数据串包。 如果不在window范围内,则没有影响( 发送一个确认报文(ack 字段为期望ack的序列号,seq为当前发送序列号),状态变保持原样)
TIME_WAIT 问题比较比较常见,特别是CGI机器,并发量高,大量连接后段服务的tcp短连接。因此也衍生出了多种手段解决。虽然每种方法解决不是那么完美,但是带来的好处一般多于坏处。还是在日常工作中会使用。
1、改短TIME_WAIT 等待时间
这个是第一个想到的解决办法,既然等待时间太长,就改成时间短,快速回收端口。但是实际情况往往不乐观,对于并发的机器,你改多短才能保证回收速度呢,有时候几秒钟就几万个连接。太短的话,就会有前面两种问题小概率发生。
2、禁止Socket lingering
这种情况下关闭连接,会直接抛弃缓冲区中待发送的数据,会发送一个RST给对端,相当于直接抛弃TIME_WAIT, 进入CLOSE状态。同样因为取消了 TIME_WAIT 状态,会有前面两种问题小概率发生。
3、tcp_tw_reuse
netipv4tcp_tw_reuse选项是 从 TIME_WAIT 状态的队列中,选取条件:1、remote 的 ip 和端口相同, 2、选取一个时间戳小于当前时间戳; 用来解决端口不足的尴尬。
现在端口可以复用了,看看如何面对前面TIME_WAIT 那两种问题。 我们仔细回顾用一下前面两种问题。 都是在新建连接中收到老连接的包导致的问题 , 那么如果我能在新连接中识别出此包为非法包,是不是就可以丢掉这些无用包,解决问题呢。
需要实现这些功能,需要扩展一下tcp 包头。 增加 时间戳字段。 发送者 在每次发送的时候。 在tcp包头里面带上发送时候的时间戳。 当接收者接收的时候,在ACK应答中除了TCP包头中带自己此时发送的时间戳,并且把收到的时间戳附加在后面。也就是说ACK包中有两个时间戳字段。结构如下:
那我们接下来一个个分析tcp_tw_reuse是如何解决TIME_WAIT的两个问题的
4、tcp_tw_recycle
tcp_tw_recycle 也是借助 timestamp机制。顾名思义, tcp_tw_reuse 是复用 端口,并不会减少 TIME-WAIT 数量。你去查询机器上TIME-WAIT 数量,还是 几千几万个,这点对有强迫症的同学感觉很不舒服。tcp_tw_recycle 是 提前 回收 TIME-WAIT资源。会减少 机器上 TIME-WAIT 数量。
tcp_tw_recycle 工作原理是。
其实在互联网中,由于实际使用的是TCP/IP模型,也就是DOD模型(现在不知道没关系,后面会说)所以7层模型在现实网络环境中只是一个理论上,学究派的东西这个模型中,我们真正关心的是下面的3层1物理层
哦是的这个名词还算容易了解网卡还有那些网线构成了这一层那些在网线中传播的二进制数据流是这层的具体表象也就是说,这一层上面没有什么协议(不是很精确的说法,但是你可以这么理解)有的都是电流而已我们把两台机器用网线连起来或者用HUB把机器都连起来,这些工作就是物理层的工作
有2个设备属于物理层的,一个是中继器,一个是HUB大家知道物理上面的连线距离一长就会产生电信号的衰减为了重新加强这个信号,我们就需要在一定距离之后加上一个信号放大器,这就是中继器(repeater)
恩这个比较容易理解repeater就是连接在2根网线之间的么没有做任何处理所以只是一个物理设备属于1层的
那么集线器(HUB)呢这个怎么会是在1层似乎非常难以理解
当我说出HUB的本质,大家就能够清楚了解了
HUB的本质其实只是一个多口中继器(MULTI PORT REPEATER)啊这样大家能够理解了HUB不叫多口中继器其实只是为了销售上面的策略他的本质就是连接多根网线的一个物理设备也是不对经过的电信号做任何逻辑处理的
2数据链路层
欧~这个名词有些别扭了DATA LINK层英文似乎更加容易理解
这个层面上面的东西不再是电信号了而是DATA了对,既然是DATA就有了逻辑关系了这个层面上面的基本单位是帧(Frame)这层和物理层的接触是最紧密的他是把从网线上面传输的电流转换成0和1的组合
物理层只是网卡对网线发出或者接受各种电平信号,那就是说物理层是无法判别电流的来源和目标的那么把电流打成0和1的帧之后里面就有逻辑数据了有了数据,就可以判别数据从何而来,到何处去所以也就可以真正的形成LINK
既然可以判别地址,那么地址是按照什么来判别的呢
那就是最重要的概念之一:MAC地址
大家肯定都听说过我们的网卡都有MAC地址
有些人可能也知道MAC地址都是唯一的
对MAC地址是全球唯一的也就是说你的网卡虽然便宜但是他也是世界上独一无二的
有些人说他可以改MAC那就不是唯一了对虽然可以更改,那只是欺骗上层对封包里面的MAC地址进行改写你网卡真正的MAC地址是固化的无法修改的
我们有了MAC地址了这样就可以有针对性对所有连接在一起的计算机进行通讯了是的我们终于可以在一个局域网内通讯了
但是有个问题我们前面没有提到就是既然物理层传输的是电信号那么如果我有2台机器一起发电信号,信号岂不是混乱了么
非常正确这个问题在网络里面成为"碰撞",所以协议里面规定了如果你需要往外发数据,一定需要先看看电缆里面有没有别的信号如果没有,那就可以发如果2者同时发送,检测到碰撞之后2者分别等待一个随机时间,然后重发这个就是重要的"碰撞检测"
哈看来问题解决了不是么现在整个网络可以正常运行了
确实如此但是如果连接在网络上的计算机越来越多,那么碰撞的现象会越来越频繁这样效率一定很低了恩这里还有一个重要概念"冲突域"在同一个物理上连接的网络上的所有设备是属于同一个冲突域的
接着就需要引入我们的2层设备来分割冲突域了
网桥(Bridge)就是连接2个不同的物理网络的主要功能是在2个网络之间转发Frame因为从实际中我们可以知道其实很多时候并非整个网络都在相互通讯最多相互通讯的一组计算机我们可以分在一个小的冲突域内这样分割以后可以减少冲突域,也就相对的减少了冲突的机会而之间使用网桥来桥接,由于网桥两边的通讯不是非常频繁,所以使用网桥来为2边作为"代言人"这样任意一个小网络里面产生冲突的机会就少了
交换机(Switch)是我们最熟悉的设备了,交换机的本质其实就是一个多口网桥(Multi port Bridge)同理可得交换机的每个口后面都是一个冲突域我们都说交换机比HUB快,就是因为交换机分割了所有的冲突域
由于现在交换机非常便宜所以一般我们都是直接在交换机的口上接计算机这样每台计算机都是一个独立的冲突域这样碰撞的问题就没有了所以速度是比HUB快
而前面说过2层设备主要是个转发的功能交换机的主要功能就是转发包而不是让所有的冲突域直接物理连接所以交换机有CPU,有内存,可以对frame进行处理等等这些也是交换机和HUB的区别
3网络层
我们前面的一些技术就可以构建出局域网了有了网络层以后数据才能够真正的在整个世界间传送
由于伦纳德·博萨卡(Leonard Bosack)和姗蒂•雷纳(Sandy Lerner)为了解决他们之间的通信问题(关于路由器发明的版本有很多你听到的别的说法可能比这个说法更准确,但是谁知道呢呵呵)路由器被发明用来解决"信息孤岛"问题而且如果是由SWITCH来构建整个网络,那么整个网络将会有"中心节点",这样也不符合ARPANET的初衷所以我们有了这一层(这样说可能会感觉本末倒置,但是先这么理解吧)
这一层的基本单元是包(Packet)所有的包都有一个IP头啊听起来很熟悉不是么IP就是用来在这层上面标识包的来源和目的地址的
这层的一个主要概念就是"路由",也就是和switch一样,把包转发到其他的地方不过有个不同的地方,switch只有知道具体的MAC在哪里的情况下才能够发送给指定的计算机,而路由则不需要知道最终IP所在的计算机在哪个位置,只要知道那个途径可以过去就可以工作
这3层构建了整个网络的基础由于TCP/IP模型将最下面2层合并成为一层,所以在TCP/IP里面总共这2层也是整个构架最基础的内容而网络方面要做的工作也都是针对于这2层做的
2: TCP/IP真实世界的模型
上一讲里面我们说过OSI 7层模型只是一个理论模型,而实际中只需要保证7层的功能能够实现,实际分层无需按照7层来分而且如果真的分7层那么数据处理的速度便要慢许多
在实际应用中使用最多的便是DoD模型也成为TCP/IP协议簇
DoD模型(Department Of Defanse Model 美国国防部模型)顾名思义,是美国国防部设计的一个网络模型最早用于ARPANET这些话可能在许多教材的第一章就会讲了但是一般教材对于DoD模型与OSI模型对应关系都没有讲到或者很多是模糊或者错误的
在这里我就要描述一下2者对应关系OSI模型有7层我们已经知道了,而DoD模型则只有4层下面是对应关系
OSI DoD
7Application ┐
6Presentation |-> 4 Application/Process
5Session ┘
4Transport ---> 3 Host to Host
3Network ---> 2 Internet
2Data Link ┬-> 1 Network Access
1Physical ┘
由于我不会制表符所以图有些难看其实就是OSI的12层对应DoD的第1层,OSI的567对应DoD的第4层
其实这个还是比较容易记忆的
由于物理层和数据链路层非常密切所以分为一个然后上面依次对应,最上面的一大块成为应用层(处理层)
现在我们有了一个可用的实际模型了不过一般我们在描述某个设备或者协议的时候还是会使用OSI的模型,比如我们在讨论SWITCH的时候,就会说他是一个2层的设备而路由器是一个3层的设备,还会有一些特殊的设备,比如3层交换机,4层交换机这些都是使用OSI模型进行分类的这点大家不要搞混淆了
我们一直听说TCP或者UDP还有什么SMTPPOP3这些协议到底是在哪一层定义的那接下来的一张图会给大家一个非常清晰的概念了(不能算是图拉 :D )
4 APPLICATION
>
即使端口处于2MSL状态,使用该选项,仍然能够在该端口建立连接。
服务器常会设置该选项,以防服务器重启。
如果在TIME_WAIT时间内,收到了对端发送来的数据报(不是重置报文段都行),那么该状态将被破坏,称为 时间等待错误 。原因是,当收到报文段以后,通常Seq是旧的,所以本端就会发送ACK,对端已经关闭或者是别的连接,就会发送RST,导致TIME_WAIT状态被破坏。
但是许多系统规定,TIME_WAIT状态是不对重置报文段做出反应。
两端同时发送FIN,两端又同时ACK。又同时进入TIME_WAIT
当处于TIME_WAIT的主机崩溃以后,重启,然后需要等待相当与一个MSL的时间才能建立新的连接。
这段时间成为静默时间。
当一段发现到达的报文段对相关连接(也就是进程,套接字对)而言不正确的时候,TCP就会发送一个重置报文段,从而导致对端的连接快速拆卸(也就是结束吧!)。
重置报文段的ACK位必须有,而且ACK的值必须在正确的窗口范围内,这样可以防止被攻击。
FIN正常关闭一条连接成为 有序释放 ,通常不会出现丢失数据的情况。
重置报文段终止一条连接成为 终止释放 。重置报文段在任何时候都可以发送,代替FIN来终止连接,且不学校对端ACK
终止报文段特性:
当该数值设置为0,那么也意味着,不会再连接终止之前为了确保本端缓存中的数据都发送出去而等待。
TCP在发送数据时会设置计时器,如果计时器超时认为受到数据确认信息,就会引发相应的超时,或给予计时器的重传 *** 作,计时器超时时成为重传超时( RTO )。
TCP累计确认无法返回新的ACK,或者当ACK包含选择确认信息(SACK)时,表明出现书序数据报,空洞。就会引起 快速重传 。
若RTO短与RTT,那么没分都会重传,反之,整个网络利用率就会随之下降。
RTT样本 :TCP在收到数据后会返回确认信息ACK,该信息中携带一个字节的数据,测量传输该确认需要的时间,该测量结果成为RTT样本。
每个连接的RTT军独立计算。
如何根据RTT来设置RTO,有如下的方法
公式: SRTT=aSRTT+(1-a)RTT ,a取 08-09 。
当TCP运行在RTT变化较大的网络中,无法取得期望的结果。
以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补
因为丢失ACK,或者实际RTT显著增长,可能出现伪超时的现象。
以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补
每个包可以选择各自的传送路径。某些高级路由器的采用多个并行数据链路,不同的处理演示也会导致包的离开顺序和到达顺序不匹配
包的失序会造成重传,很近单嘛,前面一个小号的Seq没到达,后面的先到达,那么ACK就会 重复
当TCP超时重发是,循序执行重新租宝,发送送一个更大的报文段提高性能,不超过MSS和MTU。
出现在每次传送的包较小,又丢包的情况
每个交互键通常会生成一个单独的数据报,也就是每个按键是独立传输的。
ssh调用一个shell,对客户端输入的字符做出辉县,因此,每个字符生成4个tcp数据段,客户端的交互按键输入,服务器对按键的ACK,服务器生成的辉县,客户端对回显的ACK。通常第二段和第三段合并,成为 捎带延时确认 。
PSH位设置,意味着发送端的缓存为空,也就是没什么可以发送了。
许多情况下,TCP并不是对每个到来的包都单独的ACK,利用累计ACK可以确认之前的ACK。累计确认可以允许TCP延时一段时间发送ACK,以便将ACK和相同方向上需要传输的数据结合发。这种捎带传输的方法常用于批量数据传输。
不能任意的延迟ACK,会造成重传。同时当失序发生时,必须立刻传送ACK。
系统可以设置,一般延时为200-600毫秒。
该算法要求,当TCP连接中有在传数据(那些已发送,但是未确认的数据)时,小的报文段就不能被发送,知道所有的数据都受到ACK。并且受到ACK后,TCP收集这些小的数据,整合到一个报文段中发送。
这种方法破事TCP遵循等停规程,只有收到所有传送数据的ACK后才能继续发送新数据。
该算法的不同之处在于他实现了自时钟控制,ACK返回越快,传输也越快。在相对高延迟的广域网中,更需要减小小报文的数目,该算法使得单位时间内发送的报文数目更少,RTT控制发包速率。
该算法减少小包数目的同时,也增大了传输时延,也就是总的发送时间。
窗口大小表明本端可用缓存大小,对端传送的数据不应该超过改大小。
也表明对端发送的数据的最大大小为TCP头部ACK号和窗口大小字段之和。
也就是Seq = ACK+MSS
TCP活动的两端都维护一个发送窗口结构和接受窗口结构。
TCP以 字节 为单位维护窗口结构。
每个TCP报文段都包含ACK号和窗口通告信息,TCP发送端可以据此调节窗口结构。
窗口左边界不能左移。
窗口的动作分为,关闭(收到ACK,左边右移),打开(MSS扩大,右边右移),收缩(MSS减小,右边左移)
当收到ACK号增大,而MSS不变时窗口向前 滑动
当当左边界与右边界相等时,成为 零窗口 ,此时发送端不能在发送新的数据,这种情况下,TCP开始探测对端窗口,伺机增大窗口。
当接受窗口值变为0是,可以邮箱的组织发送端继续发送,知道窗口大小回复为非0值。当接收端窗口得到可用空间是,就会给发送端传输一个窗口更新,告知器可以继续发送数据,这样的这样的窗口更新通常不包含数据,成为纯ACK,因此不能保证传输的可靠性。
如果一端的窗口更新ACK丢失,通信双方就会处于等待状态。为避免这种情况发生。发送端会采用一个持续计时器间歇性的查询接收端,看其窗口是否已经增长。
持续计时器会触发窗口探测的传输,强制要求对端返回ACK。 窗口探测包 包含一个字节数据,采用TCP传输,因此可以避免窗口更新丢失导致的死锁。因为包含一个字节数据Seq改变,接受端必须处理,如果接受就会ACK。窗口大小还是0,那么就会丢弃该报,没有响应。这时候发送端会持续的发送窗口探测包。
当接收端通告窗口较小,或者发送端发送的数据较小。这样数据报的有效携带率小,耗费网络资源多。
避免方法
以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补以后再补
TCP/IP是供已连接因特网的计算机进行通信的通信协议。TCP/IP协议TransmissionControlProtocol/InternetProtocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。
TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。
TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。网络接口层,位于TCP/IP协议中的最底层;该层的作用,就是把网络层封装好的数据,传输到目标计算机上;该层是对数据链路层和物理层的合并;
在OSI体系中,物理层处于最底层;
它所干的事情,就是把两台计算机(通过光纤、电缆等)连接起来,然后把一些二进制(例如010100000)数据从计算机A传输到计算机B上;
此处就有疑问了:
疑问:
网络链路层里面,通过ARP查找Mac地址,以及发送数据到具体的计算机,都需要在 子网 下,那 子网 是什么?
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)