20180823上课笔记

课堂笔记

  • 查看cpu信息: lscpu    或者  cat /proc/cpuinfo
  • 查看系统版本:cat /etc/issue 或者 命令 lsb_release
  • 查看内核版本:uname -r
  • 查看内存信息:cat /proc/meminfo
  • 查看pcie信息: lspci -k
  • 命令netstat查看网络状态:

  1. 各个程序都有相对应的端口
  2. 查看服务是否开启,就可以通过netstat命令来查看对应端口开启的情况。
  • 进程和线程的区别:
  1. 进程:正在运行中的程序。
  2. 线程:进程中的一条执行路径。
  3. 通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
  4. 线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。
  5. 进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
  6. 线程的上下文切换远大于进程间上下文切换的速度。
  7. 进程是不可执行的实体,程序是一个没有生命的实体,只有当处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
  8. 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
  9. 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
  10. 处理机分给线程,即真正在处理机上运行的是线程。
  11. 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体。

TCP 三次握手

  • client:发送SYN包至,并进入SYN_SENT状态,等待服务器确认
  • sever:收到的SYN包,发送ACK,同时发送自己的SYN,进入SYN_RCVD状态
  • client:收到SYN+ACK后,进入ESTABLISHED状态,发送服务器SYN包的确认ACK,服务器接收客户端ACK后,进入ESTABLISHED状态

SYN(Synchronize Sequence Numbers)同步序列编号,建立连接时使用的握手信号
同步:函数调用者需等待函数执行完成后才能进到下一步
当客户端和服务器都进入ESTABLISHED状态后,客户端和服务器之间就可以开始双向传递数据了
syn_sent是主动打开方的「半打开」状态,syn package has been sent
syn_rcvd是被动打开方的「半打开」状态,syn package has been received

TCP四次挥手

  • 主动关闭方:主动关闭方发送FIN并进入FIN_WAIT1状态
  • 被动关闭方:被动关闭方接收到主动关闭方发送的FIN并发送ACK,此时被动关闭方进入CLOSE_WAIT状态;主动关闭方收到被动关闭方的ACK后,进入FIN_WAIT2状态
  • 被动关闭方:被动关闭方发送一个FIN并进入LAST_ACK状态
  • 主动关闭方:主动关闭方收到被动关闭方发送的FIN并发送ACK,此时主动关闭方进入TIME_WAIT状态,经过2MSL时间后关闭连接;被动关闭方收到主动关闭方的ACK后,关闭连接

TIME_WAIT状态:标准的持续时间是4分钟,4分钟后才会进入到closed状态,释放套接字资源
MSL:就是maximium segment lifetime——最长报文寿命
四次挥手也并不总是四次挥手,中间的两个动作有时候是可以合并一起进行的,这个时候就成了三次挥手,主动关闭方就会从fin_wait_1状态直接进入到time_wait状态,跳过了fin_wait_2状态。

TCP 数据传输

TCP 数据传输就是两个人隔空对话,差了一点距离,所以需要对方反复确认听见了自己的话。

张三喊了一句话(data),李四听见了之后要向张三回复自己听见了(ack)。

如果张三喊了一句,半天没听到李四回复,张三就认为自己的话被大风吹走了,李四没听见,所以需要重新喊话,这就是tcp重传。

也有可能是李四听到了张三的话,但是李四向张三的回复被大风吹走了,以至于张三没听见李四的回复。

扫描二维码关注公众号,回复: 3194972 查看本文章

张三并不能判断究竟是自己的话被大风吹走了还是李四的回复被大风吹走了,张三也不用管,重传一下就是。

既然会重传,李四就有可能同一句话听见了两次,这就是「去重」。「重传」和「去重」工作操作系统的网络内核模块都已经帮我们处理好了,用户层是不用关心的。

张三可以向李四喊话,同样李四也可以向张三喊话,因为tcp链接是「双工的」,双方都可以主动发起数据传输。不过无论是哪方喊话,都需要收到对方的确认才能认为对方收到了自己的喊话。

张三可能是个高射炮,一说连说了八句话,这时候李四可以不用一句一句回复,而是连续听了这八句话之后,一起向对方回复说前面你说的八句话我都听见了,这就是批量ack。

但是张三也不能一次性说了太多话,李四的脑子短时间可能无法消化太多,两人之间需要有协商好的合适的发送和接受速率,这个就是「TCP窗口大小」。

网络环境的数据交互同人类之间的对话还要复杂一些,它存在数据包乱序的现象。

同一个来源发出来的不同数据包在「网际路由」上可能会走过不同的路径,最终达到同一个地方时,顺序就不一样了。

操作系统的网络内核模块会负责对数据包进行排序,到用户层时顺序就已经完全一致了。

一.使用w查看系统负载

  • 使用w和uptime 可以查看系统负载。
  • 查看CPU的信息: cat /proc/cpuinfo
  • processor处的数字是cpu线程的编号,从0开始依次显示表示1个线程、2个线程。
  • 直接过滤显示有多少个线程数。: cat /proc/cpuinfo |grep processor |wc -l  
  • 这三位数,以首位1分钟平均负载最能体现CPU最近的负载情况。如图:

  1. 在单核心情况下的负载。
  2. Load < 0.7时:系统很闲,马路上没什么车,要考虑多部署一些服务
  3. 0.7 < Load < 1时:系统状态不错,马路可以轻松应对
  4. Load == 1时:系统马上要处理不多来了,赶紧找一下原因
  5. Load > 5时:马路已经非常繁忙了,进入马路的每辆汽车都要无法很快的运行
  6. load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

二、vmstat命令监控系统的状态

命令w查看的是系统整体上的负载,通过看那个数值可以知道当前系统有没有压力。但它无法判断具体是哪里(CPU,内存,磁盘等)有压力,所以这就用到了vmstat。

  • 命令vmstat,静态显示一次状态
  • 命令vmstat 1 ,  数字部分表示多少秒显示一次状态。(ctrl+c终止显示,不然就会一直动态显示下去。命令vmstat 1 5  ,第一位数字表示多少秒显示一次状态,第二位数字表示显示多少次。

  • roc 显示进程相关信息
  1. r:=run,表示运行中或等待cpu运行的进程数,如果该数长期大于服务器CPU个数,则说明CPU不够用了。
  2. b: =block ,表示等待资源的进程数,如,等待I/O,内存等,这列的值如果长时间大于1,则需要关注一下。
  • memory 内存相关信息
  1. swpd:表示切换到交换分区的内存量(当该数据不断变化时说明内存不足)
  2. free:表示当前空闲的内存量
  3. buff :数据缓冲(CPU --->内存(buff)---->磁盘)
  4. cache:高速缓存  (磁盘--->内存(cache)---->CPU)
  • swap 内存交换情况
  1. si:=storage in,表示交换区写入到内存的数据量
  2. so:=storage out,表示由内存写入到交换区的数据量
  • io 磁盘使用情况
  1. bi:=block in,表示从块设备读取数据(写入内存)的量(即:读磁盘),单位为KB;
  2. bo:=block out,表示(从内存读取)写入到块设备的数据(即:写磁盘),单位为KB;
  3. 此处数据会直接关系到proc出的b的值。
  • system 显示采集间隔内发生的中断次数
  1. in:表示在某一时间间隔中观测到的每秒设备中断数
  2. cs:表示每秒产生的上下文切换次数
  • CPU 显示CPU的使用状态(us+sy+id=100%)
  1. us:表示用户资源所花费CPU的百分比(当该值长时间>50时说明CPU数量不足)
  2. sy:表示系统资源所花费CPU的百分比
  3. id:表示CPU处于空闲状态的百分比
  4. wa:=wait,表示等待使用CPU的百分比(该数值大说明CPU不足)
  5. st:表示被偷走的CPU所占百分比(该值一般为0,不用关注)

注意:需要关注的是r,b和wa这3列,io部分和bi和bo也是要经常参考的对象,如果磁盘io压力很大,这两列的数值会比较高(大于5千算高)。另外,当si和so两列的数值比较高并且不断变化时,说明内存不够了,内存中的数据频繁交换分区中,这往往对系统性能影响极大。

三、top命令动态查看进程命令

  • top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下:
  1. N – 以 PID 的大小的顺序排列表示进程列表
  2. P – 以 CPU 占用率大小的顺序排列进程列表
  3. M – 以内存占用率大小的顺序排列进程列表
  4. q – 退出 top
  5. 数字1 —具体cpu的使用率
  6. 敲ENTER或者 SPACE键: 刷新显示
  • 命令top -c 显示具体的进程路径,如图:
  • 命令top -bn1 静态显示
  • 命令top第一行参数依次对应:

系统当前时间 up 系统到目前为止运行的时间, 当前登陆系统的用户数量, load average后面的三个数字分别表示距离现在一分钟,五分钟,十五分钟的负载情况。 这行信息与命令uptime显示的信息相同 。

注意:load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

  • 命令top第二行参数依次对应:

tasks表示任务(进程),91 total则表示现在有91个进程,其中处于运行中的有1个,90个在休眠(挂起),stopped状态即停止的进程数为0,zombie状态即僵尸的进程数为0个。

  • 命令top第三行CPU参数依次对应:
  1. 参数us:user 用户空间占用cpu的百分比 
  2. 参数sy:system 内核空间占用cpu的百分比 
  3. 参数ni:niced 改变过优先级的进程占用cpu的百分比 
  4. 参数id:空闲cpu百分比 
  5. 参数wa:IO wait IO等待占用cpu的百分比 
  6. 参数hi:Hardware IRQ 硬中断 占用cpu的百分比 
  7. 参数si:software 软中断 占用cpu的百分比 
  8. 参数st:被hypervisor偷去的时间
  • 命令top第四行,内存状态:

依次对应:物理内存总量(1G),空闲内存总量(250MB),使用中的内存总量(550MB),缓冲内存量 第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心 。

  1. 命令top第五行,swap交换分区:依次对应:交换区总量(2G),空闲交换区总量(2G),使用的交换区总量(0G),可用交换取总量对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。参考下图:

  • 命令top第六行,为空行。
  • 命令top第七行:

  1. PID — 进程id 
  2. USER — 进程所有者 
  3. PR — 进程优先级 
  4. NI — nice值。负值表示高优先级,正值表示低优先级 
  5. VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES 
  6. RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA 
  7. SHR — 共享内存大小,单位kb 
  8. S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 
  9. %CPU — 上次更新到现在的CPU时间占用百分比 
  10. %MEM — 进程使用的物理内存百分比 
  11. TIME+ — 进程使用的CPU时间总计,单位1/100秒 
  12. COMMAND — 进程名称(命令名/命令行)。

四、sar 命令

  • 命令sar -n DEV 1 10   每隔1秒钟共显示10次网卡的运行情况。
  1.  数字1,表示间隔多少时间显示一次。
  2.  数字10,表示显示多少次。

  1.  rxpck/s         每秒钟接受的数据包的量。(一般几千到算正常,上万的数据包量多数是被攻击了)
  2.  txpck/s         每秒钟发送的数据包的量。
  3.  rxkb/s           每秒钟下载的数据量。(下载量过高,会导致带宽占用满)
  4.  txkb/s           每秒钟上传的数据量。

  • 命令sar 会在 /var/log/sa/目录下以具体日期为结尾生成一个历史文件,最多保留30天内的。
  • 命令sar -n DEV -f /var/log/sa/  可以查看具体某一天的历史数据。
  • 命令sar -q   显示系统的负载。(可以跟间隔时间和次数,也可以跟具体某一天的文件名用以查看历史的系统负载数据。)

  1. 参数runq-sz  运行队列的长度(等待运行的进程数,每核的CP不能超过3个)
  2. 参数plist-sz 进程列表中的进程(processes)和线程数(threads)的数量
  3. 参数ldavg-1 最后1分钟的CPU平均负载,即将多核CPU过去一分钟的负载相加再除以核心数得出的平均值,5分钟和15分钟以此类推
  4. 参数ldavg-5 最后5分钟的CPU平均负载
  5. 参数ldavg-15 最后15分钟的CPU平均负载
  • 命令sar -b   显示磁盘读写。(可以跟间隔时间和次数,也可以跟具体某一天的文件名用以查看历史的磁盘读写数据。)

  1. 参数tps  磁盘每秒钟的IO总数,等于iostat中的tps
  2. 参数rtps 每秒钟从磁盘读取的IO总数
  3. 参数wtps 每秒钟从写入到磁盘的IO总数
  4. 参数bread/s 每秒钟从磁盘读取的块总数
  5. 参数bwrtn/s 每秒钟此写入到磁盘的块总数
  • 每一年都会自动生成一个sar文件,该文件可以使用cat等命令查看

五、nload命令监控网卡

  • 安装扩展源:yum install epel-release
  • 安装nload:yum install nload
  • 命令nload 可以实时的监控网卡的吞吐量。
  • 在nload界面中使用方向键可以切换不同的网卡。
  • nload 默认分为上下两块:
  1. 上半部分是:Incoming也就是进入网卡的流量.
  2. 下半部分是:Outgoing,也就是从这块网卡出去的流量.
  3. 每部分都有当前流量(Curr)
  4. 平均流量(Avg)
  5. 最小流量(Min)
  6. 最大流量(Max)
  7. 总和流量(Ttl)

六、监控io性能

  • 命令 iostat -x  磁盘使用情况。

  1. rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
  2. wrqm/s: 每秒对该设备的写请求被合并次数
  3. r/s: 每秒完成的读次数
  4. w/s: 每秒完成的写次数
  5. rkB/s: 每秒读数据量(kB为单位)
  6. wkB/s: 每秒写数据量(kB为单位)
  7. avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
  8. avgqu-sz: 平均等待处理的IO请求队列长度
  9. await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
  10. svctm: 平均每次IO请求的处理时间(毫秒为单位)
  11. %util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
  • 命令 iotop   实时的查看具体进程使用磁盘的情况。

七、free 命令

  • 命令free可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。

  • 命令free -m  指定MB为单位,显示内存情况。
  • 命令free -h   更加直观的显示内存情况(在具体的数字后面显示单位)。
  1. total      内存的总量 (total=used+free+buff/cache)
  2. used      使用的内存量
  3. free       剩余的内存量
  4. buff       数据缓冲(CPU --->内存(buff)---->磁盘)
  5. cache    高速缓存  (磁盘--->内存(cache)---->CPU)
  6. avaliable   包含有free和buffer/cache的剩余部分

八、PS命令查看系统进程信息

命令ps用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。命令ps aux  显示所有进程的运行状态(静态)。

  • 命令ps -elf    与ps aux效果类似。
  • 命令kill  PID   可以结束指定PID的进程。例:kill 123
  • 目录/proc 下有众多数字命名的目录,就是对应pid进程的相关目录。可以用于查看具体进程从哪里启动。

  1. VSZ    虚拟内存
  2. RSS    物理内存(与TOP命令中的RES相同)
  3. STAT 下字母代表的各种状态
  • D   不能中断的进程
  • R    run状态的进程      (短时间内运行过的进程状态)
  • S    sleep状态的进程  (运算结束后进入sleep状态的进程)
  • T    暂停的进程(ctrl+z 暂停的进程)
  • Z    僵尸进程  (父进程被杀后遗留的进程,过多时会占用系统资源)
  • <    高优先级进程
  • N   低优先级进程
  • L    内存中被锁了内存分页
  • s    主进程
  • l     多线程进程(进程里包含了线程,线程是进程的子单元, 同一个进程下的线程全部共享相同的内存)
  • +    前台进程

九、查看网络状态netstat

  • 命令netstat  用于查看网络状态。
  • 命令netstat -lnp 可以查看监听端口,选项-p显示与连接有关的程序名和PID,选项-l只显示监听的选项,-n使用域名解析功能。
  • 命令netstat -an 查看系统的网络连接状况,选项-a列出所有选项。
  • 命令netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'  统计TCP进程状态:

  1. LISTEN:服务器在等待进入呼叫
  2. SYN_RECV:一个连接请求已经到达,等待确认
  3. ESTABLISHED:正在通信
  4. FIN_WAIT1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
  5. FIN_WAIT2:从远程TCP等待连接中断请求
  6. CLOSING:等待远程TCP对连接中断的确认
  7. TIME_WAIT:等待原来的发向远程TCP的连接中断请求的确认
  8. LAST_ACK:等待原来的发向远程TCP的连接中断请求的确认

  • TCP与UDP区别总结:
  1. TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  3. Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
  4. UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
  5. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
  6. TCP对系统资源要求较多,UDP对系统资源要求较少。

  • 为什么UDP有时比TCP更有优势?
  1. UDP以其简单、传输快的优势,在越来越多场景下取代了TCP,如实时游戏。
  2. 网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。
  3. TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP内置的系统协议栈中,极难对其进行改进。

十、Linux下抓包

  • tcpdump 抓包工具(抓取网络数据的流向),使用 yum install -y tcpdump 安装该命令。
  • 命令tcpdump -nn -i 指定网卡名称,第一个n表示IP以数字的形式显示不加时以主机名显示。例:tcpdump -nn -i ens33 抓取网卡ens33的数据流向。

注:数据包一般为TCP的,当出现UDP的包时可能已经被攻击(udp flood),预到这样的攻击时,只能接入专业的防范攻击设备或者服务。

  • 命令tcpdump -nn -i ens33 port 22,指定端口监听,port 22即表示端口22。
  • 命令tcpdump -nn -i ens33 not port 22 and host 192.168.111.111
  1.      not表示除外
  2.      host指定IP的包
  3.      即表示抓取监听host指定的ip的数据包,并排除port指定的端口。
  • 命令tcpdump -nn -i ens33 -c 100,指定抓取该网卡100次的数据包。(如果在该终端不去产生数据流的话,并不会产生太多的数据包)
  • 命令tcpdump -nn -i ens33 -w /tmp/1.tcp    
  1.      将抓取的指定网卡数据包信息,输出到你指定的文件。
  2.      该文件无法直接使用cat命令查看。
  3.      命令tcpdump -r /tmp/1.tcp  使用-r选项可以查看指定的数据包文件。

  • 命令tshark可以抓取指定网卡的80端口的web数据包
  • 命令tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host' -e "http.request.method"  -e "http.request.uri"    查看指定网卡80端口的被访问情况(具体的ip访问的内容等信息)

十一、Linux网络相关

  • 命令ifconfig 查看网卡的iP,无法使用该命令时,安装yum install -y net-tools 
  • 命令ifconfig -a  显示所有的网卡信息,包括卸载的网卡。
  • 命令ifdown 卸载指定的网卡,ifup加载指定网卡。
  •    命令ifdown 不能在xshell等远程连接时使用,会导致网络断开无法连接。
  •    命令ifdown ens33 && ifup ens33  ,在卸载网卡ens33后再加载该网卡,这样不会导致远程连接断开。
  • 复制备份/etc/sysconfig/network-scripts/目录下的网卡配置文件并重命名,然后修改其中的配置文件可以设置一个新的虚拟网卡(即一个新的IP)
  1.    命令cp ifcfg-ens33 ifcfp-ens33\:0,将ens33复制并更改为ens33:0(\用于脱义:)。
  2. 修该ifcfp-ens33:0的配置文件。如图所示,将NAME、DEVICE更改为新的网卡名,更改IPADDR(使用不重复的IP地址),其余网关和DNS可以删除。
  3. 退出保存,并卸载和重新加载网关,ifdown ens33 && ifup ens33

  • 命令mii-tool ens33   查看指定网卡的是否连接,显示为link ok即为连接。无法使用该命令时,
  • 命令ethtool ens33 同样可以查看指定网卡是否连接。
  • 命令hostnametcl set-hostname 新主机名,可以更改主机名。配置文件目录:/etc/hostname  。
  • DNS的配置文件为/etc/resolv.conf 该配置文件可用于临时更改或添加DNS,重启后会被网卡配置文件中DNS所覆盖 。DNS设置可在网卡配置文件中更改/etc/sysconfig/network-scripts/ifcfg-ens33下更改。
  • 文件/etc/hosts下可以更改访问指定网站时指向到自定义的IP地址解析。(只会在本机生效)

  1. 多个域名使用空格分开
  2. 一个网址对应多个IP时,优先解析最上面的。

十三、tcp/ip的三次握手和四次挥手

最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。

  • TCP建立连接的三次握手
  1. TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
  2. TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
  3. TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
  4. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
  5. 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。 
  • 为什么不是两次握手?

  • TCP释放连接的四次挥手
  1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接收。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
  • 为什么客户端最后还要等待2MSL?

MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。

  1. 第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
  2. 第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
  3. 为什么建立连接是三次握手,关闭连接确是四次挥手呢?
  4. 建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
  5. 而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
  6. udp协议
  7. 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
  • 总结

TCP协议虽然安全性很高,但是网络开销大,而UDP协议虽然没有提供安全机制,但是网络开销小,在现在这个网络安全已经相对较高的情况下,为了保证传输的速率,我们一般还是会优先考虑UDP协议!

猜你喜欢

转载自blog.csdn.net/xiaoyuerp/article/details/82085248