2020/01/01 03-TCPIP协议1

倖福魔咒の 提交于 2020-01-29 01:05:33

OSI7层模型,和TCP/IP4层协议
OSI(物理层,数据链路层,网络层,传输层,会话层,表示层,应用层)
TCP/IP(物理层+数据链路层=网络层,INTERNET层,传输层,应用层)

在这里插入图片描述
互联网普遍才用tcp/IP协议在这里插入图片描述Application 应用层
Transport 传输层
Internet 网络层
Network Access 网络访问层

面试经常问 协议属于哪一层
FTP,TFTP ,NFS,HTTP,HTTPS,
SMTP(简单邮件传输协议,平时我们发邮件),
pop(配邮箱,pop3版本),
imap(与pop协议类似,也是可以用来从服务器下载文件用的),
telnet,
ssh(链接远程网络,QQ有自己的内部私有协议)
DNS (domain name system 域名系统)
这些都是应用层

在这里插入图片描述

传输层也有自己独立的协议(TCP,UDP协议)

session multiplexing 多路会话
segmentation 分段(传输大文件需要切片分段分成小包)
Flow control (when required)流控制(特定的协议的时候支持这个,不是特定的协议就不支持,如UDP就不支持)
connection-oriented (when required)面向连接
reliability (when required)可靠性
(when required )具体看哪种协议

在这里插入图片描述
reliable 可靠 best -effort 不可靠(较好的性能但是不可靠)
connection type 连接类型 connection-oriented面向连接 connectionless 非面向连接
所谓面向连接,就是在传输数据前,是否需要先确认通讯双方有一个可靠的网络连接,确认有可靠连接再进行通讯
非面向连接就是不管你有没有可靠的网路连接,但是效率更高,不需要确认
protocol 协议
sequencing 测序
uses使用

**TCP叫传输控制协议 有包的编号 ,有序列化数据
UDP用户数据包协议 没有包的编号,没有序列化数据 **
比如传输的时候包的数据有先后到的情况,后到了对UDP协议是无能为力的,因为并不知道包的次序是什么,没有包的编号,谁是第一个,谁是第二个,就按照谁是先收到,后收到的包,这样就可能带来问题,收到的数据可能是错误的
TCP比较适用于有容错功能的传输,邮件 文件共享,下载(邮件丢一个字节就损坏了,出错了就重传,有纠错能力)
UDP没有序号,如果数据错误只能重发,比如视频和语音
产生这样特性是因为TCP和UDP包的结构是截然不同

在这里插入图片描述面向连接(在通讯的时候,有一个协商的过程,要一个安全可靠的网络通讯状态,才能取通讯)
全双工协议(你给我发的同时,我也可以往回发)
半关闭(等于单相思)(允许单向传输数据)两个TCP协议通里要断两次,一个是你不能给我发,我不能给你发
错误检查 TCP是有错误检查功能,发现数据有问题,可以及时辨别这个问题
将数据打包成段,排序(把大的数据分段并且排序)
确认机制(对方有没有收到还需要确认)
数据恢复,重传(对方如果没有收到,那就进行恢复重传)
流量控制,滑动窗口(两个主机性能不一样,双方网卡1000M ,100M,能够进行商量,达到一个双方都可以接受的速度进行传输)
拥塞控制,慢启动和拥塞避免算法(两者中间的网络状态可能随时间不一样,有可能比较忙,就慢慢的发数据)

有这些功能是因为由TCP协议的报文来确定
报文头部是在传输层

TCP协议的数据结构

在这里插入图片描述
一个数据有很多层报文头部,需要应用层,传输层,网络层,以太网,现在研究的是TCP报文结构在这里插入图片描述
下层为上一层提供服务,就需要判断上一层协议的type类型,传输层上一层是应用层协议,比如HTTP在这里插入图片描述
所以tcp协议为了辅助上一层协议这么多应用程序就有源端口(源应用程序使用的标识)和目标端口(目标应用程序使用的标识),一般服务器端口号都是固定的
apache httpd 80
mysql 3306
sql server 1433
tcp 是UDP TCP 53 协议不同
ssh 22
在这里插入图片描述

TCP的报文是在传输层,处于网络层和会话层中间和这个位置。
一行是0-31个位(32位)
0-15表示源端口 (16位=2的16次方=65536 个端口号)16个0,最大也就16个1,16个1就等于2的16次方
16-31表示目标端口 (16位=2的16次方=65536 个端口号,目标应用程序的端口)等于最多能表达65536个应用程序

序号,谁是第一个包,谁是第二个包,序号的最大值就是2的32次方,42亿个地址,42亿个包,但是服务器长时间不关机,很短时间就会达到42亿个包,到头 了,就重新编,那会不会有重复呢,后面还有一些其他的选项来避免,加时间戳,就确保不是一个包
序号是代表你发送数据在你这里的编号
确认号,目标收到返回确认,包收到了(是对方发过来的确认的编号)
序号是在你这台电脑上的编号,确认号是对端那台电脑的编号

windows可以用tasklist查看所有运行的进程
在这里插入图片描述在这里插入图片描述
netstat 可以看到这个进程用哪个端口来进行通讯在这里插入图片描述
编号1400是vncserver
在这里插入图片描述
这边对应的服务端5900就是vnc的端口号
在这里插入图片描述在这里插入图片描述
端口号一般是有规范的,国际组织把一些常用软件预先分配了端口号
在这里插入图片描述
linux有一个文件记录了常见的软件使用的端口号
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
这个文件有一万多行
在这里插入图片描述在这里插入图片描述0-1023是IANA 互联网数字分配结构进行分配的,你自己开发软件就不要用0-1023了,因为0-1023已经有了通用的应用程序定义了
22 ssh
80 http
443 https
ftp 21 (20)
dns tcp53 udp53
tftp 69
smtp 25
pop3 110
imap 143
telnet 23
mysql 3306
oracle 1521
sql server 1433
这些相当于应用程序的唯一标识
1023以内的端口,只有root权限有资格访问
普通用户是用不了1023以内的端口号的
端口号是一种资源

这一部分可以是自己不是root身份的,自己使用的端口范围
oracle 1521 tcp/udp 11211

在这里插入图片描述
9527没人用,你就可以使用了
在这里插入图片描述
客户端的端口号是动态的
在这里插入图片描述
默认的客户端使用范围

在这里插入图片描述
端口类似应用程序的唯一地址在这里插入图片描述
序号:数据一个G,是需要分开传的,会切割成若干个小的数据报文一个个传,每个包都需要编号,谁先谁后。
确认号:确认哪个包收到了,因为通讯双方是双向的

在这里插入图片描述
telnet 默认端口23,A客户端,Z是服务器
面向连接,可靠的
可以半关闭的

确认号的问题
在这里插入图片描述
第一行 ack=1 代表0包我收到,下次发1包,seq=10是在本机已经发出去的包第几个,不是给谁的第几个包
第二行 seq1 (发1的包) ack=11(告诉对方希望发第11个包,变相告诉对方,第10个包收到了)
第三行 源端口,目标端口 seq=11 发的第11个包 ack (希望对方发2包)
第四行 源端口,目标端口 seq=2(发第二个包) ack(希望对方发第12个包)

有时候这样一个包确认一次有点效率低,可以一段段批量确认,到底发多少个包确认可以靠数据报文中的窗口来确认

序号和确认号都占32,就是0-2^32-1这个范围,42亿用完了编号,就从0开始继续算
在这里插入图片描述
还有数据偏移
在这里插入图片描述
偏移就是数据包报文的头部有多长,加这个偏移是因为,TCP这个报文头部不是固定大小,固定的大小是24字节,但是后面有一些可变长度的选项,这些选项长度大小不一样

在这里插入图片描述
**有6个位,每一位有重要的含义,URG,ACK,PSH,RST,SYN,FIN **

URG表示紧急指针位,(如果为0 表示后面的紧急指针是没有信息的,为1 就代表有重要含义)
ACK 重点掌握
PSH 表示的是收到数据以后是否直接传输给应用程序使用还是在buffer里先放一放,过一会再传给应用程序
RST 表示重置位,0表示这个数据包正常的,1表示个数据包在前面传输 时候有严重故障(我们希望把两个主机之间的信息重新传)
SYN 重点掌握
FIN 重点掌握
ACK,SYN FIN三个标记为是需要重点掌握的
这三个标记关键的实现了TCP协议的可靠,面向连接的概念
在这里插入图片描述在这里插入图片描述PSH 表示的是应用程序收到数据以后是否直接传输给应用程序使用还是在buffer里先放一放,过一会再传给应用程序。
RST 表示重置位,0表示这个数据包正常的,1表示个数据包在前面传输 时候有严重故障(我们希望把两个主机之间的信息重新传)
在这里插入图片描述
tcp协议是有自己的缓冲区的,A发给B,B接收,网卡自己有缓冲区,再复制到TCP协议的缓冲区,再复制到应用程序的缓冲区,是一一层层进行复制的
在这里插入图片描述在这里插入图片描述在这里插入图片描述这三个是同步位
SYN 重点掌握
FIN 重点掌握
ACK,SYN FIN三个标记为是需要重点掌握的
这三个标记关键的实现了TCP协议的可靠,面向连接的概念

这就是三次握手,两个主机要想发送数据,如果要可靠,就需要先建立tcp链接在这里插入图片描述在这里插入图片描述
面向连接就是在通讯之前,确保对方有没有和你有一个可靠的链接,通过三个过程来实现的,俗称三次握手
一般都是客户端主动请求访问服务器,
第一部询问是否有可靠的链接
会把SYN为打1(同步位)seq序号X(32位的序号和确认号)
第二部对方会返回一个确认,ACK=1(表示的是前面的同步位消息收到了),SYN=1(也是一个请求,代表我发了个消息,你收到没有?)seq 序号 Y ACK=X+1(确认了就在之前+1,希望下次收到x+1)
第三部 会再发一个确认,上面的ACK我已经收到了 seq=x+1(发过来的x+1包) ack=y+1(希望收到y+1的包)
在这里插入图片描述ACK=1表示的是前面的同步位收到了
seq序号
seq=x+1
ack=y+1

实际上就等于我们客户端和服务器的网络状态
A和B未通讯之前就是closed关闭状态 但是服务器不能老关着,就要切换成监听状态listen
客户端A把同步位发出去之后,客户端就从 closed进入syn-sent状态(同步已发送)
A 状态切换 CLOSED>SYN-SENT B 状态切换 listen>sys-rcvd (同步收到)
A 状态切换 SYN-SENT >estab-ished(已建立链接) B 状态切换 sys-rcvd >estab-ished(已建立链接)
建立通讯,有了这三次握手,就对我们以后的通讯有了保障
在这里插入图片描述
用ssh链接另外的机器
在这里插入图片描述在这里插入图片描述
前三个协议就是三次握手
192.168.30.100 centos7
192.168.30.128 centos6
192.168.30.100 centos7

查看第三次握手,transmission 传输 control 控制 protocol 协议 TCP协议的完整名称在这里插入图片描述
source port 源端口
destination port 目标端口
【stream index】【tcp segment len】 vmareshark软件添加的描述信息
sequence number 序号(相对的编号,对于两台的主机第一次通讯来讲是0,但是绝对的编号,是b0409f43)
acknowledgment number 确认编号0(就是从来没通讯过,没法确认)
确认1 说明对方发的0包收到了
1010…=header length 40 bytes 头的长度 偏移量 40
flags 标记 6个标记位,第一次包,SYN=1 第二次握手SYN=1 ACK=1 第三次握手ACK=1

第三次握手
三次握手主要用SYN 和ACK这两个标记位,怎么确认是第一次握手
主要看标记位其他都是0,就SYN=1就是第一次握手

在这里插入图片描述
断开连接涉及到4次过程,俗称4次挥手,是在正常协商的 情况下,如果直接网断了,死机就没有这个4次,异常断开

TCP协议是面向连接的有三次握手,FIN是用来分手的在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!