欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TCP/IP协议

程序员文章站 2024-02-13 20:51:04
...

参考:
https://jingyan.baidu.com/article/00a07f387b7e0682d028dce2.html
https://baike.baidu.com/item/%E5%BC%80%E6%94%BE%E5%BC%8F%E7%B3%BB%E7%BB%9F%E4%BA%92%E8%81%94/562749?fromtitle=OSI&fromid=5520
https://baike.baidu.com/item/TCP%2FIP%E5%8D%8F%E8%AE%AE/212915?fromtitle=tcp%2Fip&fromid=214077
TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。
TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,
是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
tcp/ip协议参考了OSI(开放式系统互联)模型;
OSI模型共7层,从下到上分别是: 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
第一层:物理层: 实际上就是布线、光纤、网卡和其它用来把两台网络通信设备连接在一起的东西。甚至一个信鸽也可以被认为是一个物理层设备。
第二层:数据链路层: 通过物理网络链路提供可靠的数据传输,简单的理解就是: 把数据帧转换成二进制位供物理层处理
第三层:网络层: 负责在源和终点之间建立连接,将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息- -源站点和目的站点地址的网络地址
第四层:传输层: 第4层提供端对端的通信管理,传输层的功能一般包括流控、多路传输、虚电路管理及差错校验和恢复;
第五层:会话层: 它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制OSI
第六层:表示层: 提供格式化的表示和转换数据服务,数据的压缩和解压缩, 加密和解密等工作都由表示层负责
第七层:应用层: 应用层是最接近终端用户的OSI层,这就意味着OSI应用层与用户之间是通过应用软件直接相互作用的,你可以发明一些你希望能够把数据发送到目的地的格式,并且创建一个第7层协议。SMTP、DNS和FTP都是7层协议

换个方法理解吧!
你要给你女朋友打电话
首先你要有一部手机(这是物理层),从麦克风说的话变成数据(这是数据链路层),
拨出电话,你的手机和她的手机建立连接(这是网络层),然后开始传输数据(这是传输层),传输过来的数据,我要验证一下(这是会话层),
验证通过的数据,进行解码(这是表示层),然后数据按照一定格式交给手机上的电话程序(这是应用层)
只能是大概的这个意思,但并不是很很准确.

TCP/IP协议简化为四个层次:网络接口层,网络层,传输层,应用层.
网络接口层:兼并物理层和数据链路层,是传输数据的物理媒介,可以为网络层提供一条准确无误的线路
网络层: 网络层可以进行网络连接的建立和终止以及IP地址的寻找等功能
传输层: 提供应用程序间的通信,一、格式化信息流;二、提供可靠传输。udp/TCP
应用层: 直接为应用进程提供服务的.

换个方法理解就是:比如顺丰
顺丰开通的航线(网络接口层)
顺丰能确保你的邮件准确的送到(网络层)
带着邮件各地转运(传输层)
顺丰接待客户的网点(应用层)
那么客户就是应用程序

tcp/ip协议和OSI协议层次对应

应用层: 应用层、表示层、会话层
传输层: 传输层
网络层: 网络层
网络接口层: 物理层,数据链路层

上面1对3,中间2对2,下面一对2

ip协议:简单了解一下参考: https://blog.csdn.net/u013479907/article/details/82735750
https://blog.csdn.net/qq_42058590/article/details/82918678
IP协议干嘛呢?
IP是整个TCP/IP协议族的核心,所有的TCP、UDP、ICMP及IGMP数据都以IP 数据报格式传输,
主要包含三方面内容:IP编址方案和分组转发规则(寻址和路由)、分组封装格式。
IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务,IP必须依赖IP地址与IP路由器两种机制来实现.

一个IP数据报由首部和数据两部分组成,首部的前一部分长度是固定的20个字节,后面部分的长度则是可变长度
头部包含:版本号,如ipv4/ipv6/ 标识,ip源地址,目标地址等

tcp协议:参考:https://baike.baidu.com/item/TCP/33012
https://blog.csdn.net/gyunling/article/details/89330307

是一种面向连接的、可靠的、基于字节流的传输层通信协议
tcp数据包格式: https://img-blog.csdn.net/20170611234116960?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTmluZ2RheGluZzE5OTQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
tcp数据包包含在ip数据包中,ip数据包包含在以太网数据包中
以太网数据包大小是固定的 最初是1518字节,后来增加到1522字节。其中, 1500 字节是负载(payload),22字节是头信息(head)
ip数据包:它也有自己的头信息,最少需要20字节,所以 IP 数据包的负载最多为1480字节。
TCP 数据包在 IP 数据包的负载里3面。它的头信息最少也需要20字节,因此 TCP 数据包的最大负载是 1480 - 20 = 1460 字节。由于 IP 和 TCP 协议往往有额外的头信息,所以 TCP 负载实际为1400字节左右
tcp首部包含:
源端口和目的端口: 共4个字节 这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接
序号(seq): 4个字节
确认序号(ack): 4个字节
数据偏移: 占4比特(1个字节等于8个bit) 实际上就是TCP首部的长度
预留字段(Reserved field):长度为6bits。值全为零。预留给以后使用
标志位(Flags): 长度为6bits。表示TCP包特定的连接状态。一个标签位占一个bit,从低位到高位值依次为FIN,SYN,RST,PSH,ACK,URG。新定义的TCP头还扩展了ECE,CWR,NS.
窗口(Window):长度16bits(2个字节)。表示滑动窗口的大小,用来告诉发送端接收端的buffer space的大小。接收端buffer大小用来控制发送端的发送数据数率,从而达到流量控制。最大值为65535.
校验和(Checksum):长度16bits(2个字节)。用来检查TCP头在传输中是否被修改。
紧急指针(Urgent pointer):长度为16bits(2个字节)。表示TCP片中第一个紧急数据字节的指针。只有当URG标志置1时紧急指针才有效。

tcp三次握手和四次挥手 参考: https://www.cnblogs.com/qdhxhz/p/8470997.html
第一次握手: 客户端向服务器发出请求
第二次握手: 服务端收到请求,如果同意连接发出确认报文;
第三次握手: 客户端收到确认报文,还要向服务端确认

换个场景理解就是:飞机(客户端)和塔台(服务端)
飞机(客户端): 呼叫塔台(服务端),我请求降落(飞机高空盘旋中)
塔台(服务端): 塔台收到,允许降落
飞机(客户端): 好的马上降落
为什么要三次握手?,而不是2次或者4次握手
两次握手会出现: 第一次握手收到,第二次握手没收到,塔台等飞机降落,但是飞机没收到,浪费资源
为什么不四次握手:?
TCP四次挥手: TCP是双向通道,即客户端—>服务端 服务端—>客户端
第一/三次挥手是发送方告诉接收方,数据发送完了,可以关闭通道了, 接受方:在确保报文都接收完了,才可以发送确认关闭的报文,完成关闭
例如 客户端向服务端发送了10个数据包,发送完了,并不代表对方接收完了,万一有数据在路由中转的时候迷路了呢?

SYN(洪水)攻击: 参考: https://www.cnblogs.com/qdhxhz/p/8470997.html 中的 四、SYN(洪水)攻击
还是从三次握手说起
飞机(客户端): 呼叫塔台(服务端),HH001请求降落
塔台(服务端): 塔台收到请HH001在1号跑道降落
飞机(客户端)被导弹击中了…
塔台(服务端): 塔台收到,请HH001在1号跑道降落 等待中…
塔台(服务端): 塔台收到,请HH001在1号跑道降落 等待中…
塔台(服务端): 塔台收到,请HH001在1号跑道降落 等待中…
塔台(服务端): 塔台收到,请HH001在1号跑道降落 等待中…
塔台(服务端): 塔台收到,请HH001在1号跑道降落 等待中…
塔台(服务端): 哦,没回应估计HH001飞走了,将1号跑道用于其他的飞机降落

SYN 攻击指的是: 攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN请求包,服务器回复确认包,并等待客户的确认
换个场景就是:
攻击方: 呼叫塔台(服务端),我xx001请求降落! 呼叫塔台(服务端),我xx002请求降落! 呼叫塔台(服务端),我xx003请求降落! 呼叫塔台(服务端), 我xx004请求降落…
塔台(服务端):塔台收到,xx001请在1号跑道降落
塔台(服务端):塔台收到,xx002请在2号跑道降落
塔台(服务端):塔台收到,xx003请在2号跑道降落
…(伪造的请求将长时间占用未连接队列)

这时候真的客机来了,
飞机(客户端):  呼叫塔台(服务端),HH001请求降落
塔台太忙了......

常见的防御 SYN 攻击(不能完全被阻止):
缩短超时(SYN Timeout)
时间增加最大半连接数
过滤网关防护SYN
cookies技术

TCP流量控制(滑动窗口协议)

参考: https://www.cnblogs.com/qdhxhz/p/10267932.html
https://blog.csdn.net/ningdaxing1994/article/details/73076795
滑动窗口是指一次发送数据帧的大小,
对所有数据帧按顺序赋予编号,发送方在发送过程中始终保持着一个发送窗口,只有落在发送窗口内的帧才允许被发送;
同时接收方也维持着一个接收窗口,只有落在接收窗口内的帧才允许接收。这样通过调整发送方窗口和接收方窗口的大小可以实现流量控制

TCP 协议为了做到效率与可靠性的统一,设计了一个慢启动(slow start)机制。开始的时候,发送得较慢,
然后根据丢包的情况,调整速率:如果不丢包,就加快发送速度;如果丢包,就降低发送速度。

数据包的遗失处理:
每一个数据包都带有下一个数据包的编号。如果下一个数据包没有收到,那么 ACK 的编号就不会发生变化。
举例来说,现在收到了4号包,但是没有收到5号包。ACK 就会记录,期待收到5号包。过了一段时间,5号包收到了,
那么下一轮 ACK 会更新编号。如果5号包还是没收到,但是收到了6号包或7号包,那么 ACK 里面的编号不会变化,总是显示5号包。
这会导致大量重复内容的 ACK。如果发送方发现收到三个连续的重复 ACK,或者超时了还没有收到任何 ACK,就会确认丢包
,即5号包遗失了,从而再次发送这个包。通过这种机制,TCP 保证了不会有数据包丢失。

重传协议:参考: https://baike.baidu.com/item/%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E5%8D%8F%E8%AE%AE
[1] 停止等待协议(stop-and-wait) 1比特滑动窗口协议 发一个接一个
[2] 回退n步协议(GO-BACK-N) 发多个接一个,错一个,后面的全部重传
[3] 选择重传协议(selective repeat) 错哪个重发哪个
至于这三种协议怎么选择,在网上找到如下说明:
只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。
收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。
当发送窗口和接收窗口的大小都等于 1时,就是停止等待协议。
当发送窗口大于1,接收窗口等于1时,就是回退N步协议。
当发送窗口和接收窗口的大小均大于1时,就是选择重发协议。

相关标签: 理论