TCP协议的基本特性,包括TCP报文首部的一些基本格式,
头部信息,
TCP协议包头
第一个部分就是目标程序和源程序的各自的端口号,
第三个字段是序列号,编号(在自己主机上的编号,发送了第几个包)
第四个字段放的是确认的编号,(收到对方的包,确认的编号)
后面还有偏移量和保留字段,还有6个比较重要的标记位。
URG紧急指针位
ACK
PSH 表示的是收到数据以后是否直接传输给应用程序使用还是在buffer里先放一放,过一会再传给应用程序
RST 表示重置位,0表示这个数据包正常的,1表示个数据包在前面传输 时候有严重故障(我们希望把两个主
机之间的信息重新传)
SYN
FIN
三次握手通讯过程,A向B通讯的时候
第一次握手就把SYN标记位设为1
第二次握手B回应数据包,会标记两个地方 SYN=1,ACK=1
第三次握手ACK=1
三次握手(5种状态)
SSH可以基于TCP协议进行通讯
这个时候已经建立握手
前三个协议就是三次握手
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次,异常断开
**断开连接一共7种状态
建立连接是客户端主动连接服务器
数据传完,不想进行通讯,断开连接,有可能是客户端,也有可能是服务器,发起断开连接请求,(分手谁都可以提分手)
A向B提出分手 FIN=1 (finish 结束的意思) seq编号=u
A从ESTAB-LISHED 连接状态 切换到fin-wait-1 终止等待1
B收到请求以后返回 ACK=1 (代表你的请求收到了,可能还有些数据没有传输完,不代表同意)
ACK消息传送后,B从ESTAB-LISHED 切换到 close-wait 关闭等待
close-wait过程中就把还未传完的数据传给A
等传送完数据B服务器会发送FIN=1 ACK=1 (代表数据传完,我也同意分手)
B发完FIN之后就会切换到LAST-ACK (最后确认状态)
A在收到B发的ack=1 之后 就切换到FIN -WAIT2 终止等待2
A在收到B的FIN=1(同意分手)之后,就切换到TIME-WAIT时间等待 (等待2倍MSL时间,MSL时间就等于消息最大生存期,一个MSL等于2个数据包发送给B需要的时间,(等待要发送到B的两倍的时间))就切换成
CLOSED
A在接收B同意FIN=1之后,就返回ACK=1(表示,B的分手请求也收到了),B从last-ack最后确认状态变为closed
**
为什么要等上2MSL (2倍的数据生存期)
有些数据在传输过程中可能存在路径的问题,先发后到,未避免这样的情况,所以等待时间,确保数据不丢失
分手抓包
centos7提出分手请求 fin=1 ack=1 seq=121 ack=201
第二次握手,ack=1(确认收到你的分手请求(不代表同意)) 编号seq=201(包编号是201,对方希望我下次发201) ackn=121 确认号(确认你发的120,希望下次发121)
第三次挥手 fin=1(也同意分手) ack=1 seq=201 ackn=122
最后一次挥手同意了只有ACK
握手挥手最好面试题里看看
有时候挥手只有三次或者1次也没有,异常情况
有限状态机 FSM
TCP协议的总11种有限状态机状态
紧急指针:特殊情况使用
选项和 填充的值 不是每个包必须有的,必须有的是前面20个字节
(至少了解源,目的端口,序号,确认号,6标记位(ack fin syn))
校验位:校验数据有没有问题
窗口:数据的大小
表示现在允许对方发送的数据量,也就是告诉对方,从报文段的确认号开始允许对方发送的数据量
dns服务TCO和UDP协议都会用到
大部分应用软件都是单端口,少部分是多端口
一般端口号是固定的,但是有些也是不固定的
NFS network file system 网络文件系统 端口不固定
**最大端口65535,如果端口用默认的比较容易黑掉
如ssh 22 tcp 端口(改起来很简单,改个配置文件就可以) **
端口号是用来标识上层应用程序的地址的
application 应用层 transport传输层
port端口等于编号,找到上层的应用程序,用端口号体现出上层应用的地址
应用层
传输层
网络层
数据链路层
物理层
端口还需要记一记,面试可能问
只回了ACK
处于wait2的时候,就没有后续了
最大孤儿连接数,不能无限链接,会浪费资源,占用你的内存资源
默认60秒保留孤儿连接
会遭到攻击,半链接攻击,syn 同步攻击
基于tcp
要把你服务器拖垮,假装我是一个客户端,发起请求SYN
但是没有下文,用的IP地址是伪造的,伪造了成百上千,
服务器就一会保留这些请求,内存容易消耗干净,造成瘫痪
一般是企业购买防火墙,或者阿里云也有服务
虚线代表服务器端发送的,实心的是客户端
三次挥手,强行断开
各有两个程序在通讯
appche http 服务 走80端口
shh 22 tcp 22端口
有几个应用程序,就有几个握手分手
客户端和服务端主要差在了listen状态
想要知道哪些软件在监听网络的访问可以用ss -ntul
UDP协议无状态
状态是从TCP的6个标记位来的
telnet 默认端口23
面向连接,可靠的
可以半关闭的
第一行 ack=1 代表0包我收到,下次发1包
第二行 seq1 (发1的包) ack11(告诉对方希望发第11个包)
第三行 源端口,目标端口 seq=11 发的第11个包 ack (希望对方发2包)
第四行 源端口,目标端口 seq=2(发第二个包) ack(希望对方发第12个包)
批量确认
TCP协议也具有纠错功能
最少重传的次数(丢包之后,至少尝试3次),最大重传的次数(丢包之后,最多尝试15次)
window size 窗口大小是1
每次接收只能一个包
等于发3个包只要确认一次就可以
固定窗口是不显示的,有可能性能有好有坏
所以不是固定的,就有滑动窗口
根据当前的状态变换窗口大小来指定传送大小
TCP协议会根据当前网络状态进行拥塞控制,会有一些算法
两个主机中间的路由器可能负载比较大,也会降低主机通讯速度
下面是看的算法名称
tcp协议报文头部
第一部分是源端口,
第二部分目标端口
第三部分序号,确认号
第四部分 偏移量,长度
第五部分保留
第六部分 6个标记位
第7部分窗口 等等后面其他内容
UDP没标记位,无状态
不管网络状态好坏直接发送数据,不管你收到不收到
好处:性能高
大部分基于TCP
QQ使用UDP
传文件就是TCP
tcp相对来讲比较安全
数据层和传输层中间有INTERNET层,下次再讲
局域网一般比较稳定的UDP