网络基础—OSI七层模型、TCP三次握手、四次握手、UDP、TCP滑窗

网络七层协议

 

 

物理层(网卡)
作用:定义物理设备标准(网线类型、光纤接口类型、各种介质的传输速率等),用于计算机之间的数据传输
传输数据:比特流(0101,bit单位比特,数模转换和模数转换)

数据链路层(交换机)
定义了如何格式化数据以进行传输,和控制对物质的访问,该层将比特数据组成帧。(交换机)
它提供错误检测和纠正
传输数据:帧
网络层(路由器)
作用,将网路地址翻译对应的物理地址;两个节点的路径发送(发送路径-接受路径) 路由器:单位是数据包。IP协议
传输数据:数据包
协议:IP协议

传输层(最重要的一层)
作用:为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节
使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路
传输数据:当数据达到最大限度、将数据分割成信息段
协议:TCP、UDP

会话层
建立和管理不同设备之间的通信
表示层
解决不同系统的通信语法的问题
应用层
规定消息头,方便接收方正确解析发送方发送的信息;为计算机用户提供应用接口,也为用户直接提供各种网络服务
协议:HTTP

 

 

 

 

 

传输控制协议tcp简介
1  面向连接的、可靠的、基于字节流的传输层通信协议
2  将应用层的数据流分割成报文段并发送给目标节点的tcp层
3  数据包都有序号,对方收到则发送ACK确认,未收到则重传
4  使用校验和来检验数据在传输过程中是否有误

 

 

flags
urg:紧急指针标志,1 有效,0 忽略。
ack:确认序号标志,1 表示确认号有效,0表示报文中不含确认信息。忽略确认号字段。
psh:push标志,1表示带有push标志的数据,指示接收方在接受到该报文段应尽快将报文段交给应用程序,而不是在缓冲区进行排队。
rst:重置连接标志,用于重置连接,或拒绝连接请求(用于处理连接中断)
syn:同步序号,用于建立连接过程 syn = 1 ack = 0 表示该数据段没有使用稍待的域,则连接应答稍待一个确认则syn=1 ack = 1
fin:finish标志,用于释放连接 1 表示发送方已经没有数据发送了 即关闭本方数据流。

 

source port (源端口)  destination(目标端口)
Sequence Number(同步序号)
Acknowledgement Number(确认序号)
Offset(偏移量)  Reserved(保留域)TCP Flags(标志位) Window(滑动窗口)
CheckSum(检验和)            Urgent Pointer(紧急指针)
TCP Options(定义一些可选参数)

source port : 表示源端口 占 2B 16位 65535 1B = 8 bit
destination port:目的端口 占 2B 16位 65535 1B = 8 bit
TCP 与 UDP 都不包含ip信息,因为那是ip层上的事情。但都会包含源端口和目的端口,端口号最大到65535,端口是传输层支持范围的。
两个进程在计算机中进行通讯可以由管道、内存共享、信号量、消息队列等方法,进行通讯,而两个进程要进行通信的前提是要能唯一的标识进程,通过这个唯一的标识找到这个进程。

window窗口:指的是滑动窗口的大小,用来告知接收端与发送端的缓存大小,以此控制发送端发送数据的速率从而达到流量控制。

check sum : 检验和,指的是奇偶校验,此校验和是对整个pct报文段,包括tcp头部,和tcp数据,以16位进行计算所得,由发送端计算和存储并由接收端进行验证。

urgent pointer:紧急指针,只有tcp flags 中的 urg = 1时才有效。指出本报文段段中的紧急字节数。

TCP option :可选项其长度可变,定义一些其他的可选参数。

 

各个状态的意义如下:

LISTEN - 侦听来自远方TCP端口的连接请求;

SYN-SENT -在发送连接请求后等待匹配的连接请求;

SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;

ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;

tcp的三次握手


1  SYN=1,seq=x(任意正整数)服务端由listen状态转为syn-rcve
2  SYN=1,ACK=1,seq=y,ack=x+1客户端由syn-sent-》estab
3  ACK=1,seq=x+1,ack=y+1服务端由syn-rcvd-》estab
数据开始传送

 

 

 

三次握手流程:
    客户端发送SYN报文段请求连接报文(SYN=1,seq=x),不能携带数据;
    服务器向客户端发送SYN+ACK报文段报文(SYN=1,ACK=1 ,seq =y,ack=x+1);
    客户端向服务器发送ACK报文段(ACK=1,seq=x+1,ack=y+1)

 


 

 

 

acknowledge number:占 4B,期望收到对方下一个报文的第一个数据字节的序号,例: B 收到了 A发送过来的报文,其序列号字段为301而数据长度是200字节,这表明B正确的收到了到序号301+200-1=500为止的数据,因此B期望收到A的下一个数据序号是501所以B在发送给A的确认报文中会把ack确认号置为501。

sequence number :  占用 4B,tcp的字节流中每个字节都是按顺序去编号的,例如一个报文的序号字段值为107而携带的数据共有100个B(字段),如果有下一个报文段就应该由107+100从207开始。

 

为什么需要三次握手才能建立起连接
为了初始化sequence Number 的初始值
通讯的双方要互相告知对方自己的初始的sequence number 
这个number 以后要作为数据通讯的序号,以保证这个进程接收的数据不会因为网络上的传输问题出现乱序。tcp会用这个序号来拼接数据避免乱序。因此在服务器回发sequence number 即第二次握手之后呢,还需要发送确认报文给服务器告知服务器说客户端已经收到你的sequence number了。

 

第一次握手,客户端会发送一个syn(syn=j)包到服务器,并进入syn_send状态,等待服务确认
第二次握手,服务器收到syn包,然后确认收到客户的syn(ack=j+1),同时自己再记录一个syn=k,然后发送一个syn+ack包,服务器进入syn_recv状态
第三次握手,则是客户端收到syn+ack的包,并想服务器发送确认宝ack(ack=k+1),发送完毕后,客户端和服务器进入established状态,完成三次握手。
应该就是   客户端发送到服务器一个值,然后服务器回应值+1后,再发送自己的一个值,客户端收到后将服务器的值+1来确保几次通讯那都已经畅通,从而完成连接

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

三次握手:
为了初始化sequence number的初始值
首次握手的隐患--SYN超时
起因:
       server收到client的SYN,回复SYN-ACK的时候未收到ACK确认;
       server不断重试直至超时,linux默认等待63秒才断开连接;
会被恶意程序耗尽连接队列,让正常程序无法访问。
防护措施:
       SYN队列满后,通过tcp_syncookies参数会发SYN Cookie;
       若为正常连接则Client会回发SYN Cookie,直接建立连接;
保活机制
      向对方发送保活探测报文,如未收到响应则继续发送
      尝试次数达到保活探测数仍未收到响应则中断连接

 

第四次握手

 

tcp采用四次挥手来释放连接

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进去FIN_WAIT_1状态

第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1,Server进入CLOSE_WAIT状态

第三次挥手:Server发送一个FIN用来关闭Server到Client的数据传送,Server进入LAST_ACK状态

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,

完成四次挥手

 

为什么需要四次挥手才能断开连接呢

全双工(允许数据在两个方向上,同时传输。即服务器和客户端可以同时互相发送数据)

因为TCP是全双工的,所以发送方和接收方都需要FIN报文和ACK报文。

即发送方和接收方各自两次挥手即可。

只不过一方是被动,所以看上去像四次挥手。

 

 

UDP特点
1  面向非连接
2  不维护连接状态,支持同时向多个客户端传输相同的消息
3  数据包报头只有8个字节,额外开销较小
4  吞吐量只受限于数据生成速率、传输速率以及极其性能
5  尽最大努力交付,不保证可靠交付,不需要维持复杂的连接状态表
6  面向报文,不对应用程序提交的报文信息进行拆分或者合并

 

TCP VS UDP

 

1 面向连接vstcp 是面向连接(tcp面向连接有三次握手的连接过程), udp是无连接 适合消息的多播发布,单个点向多个点传输
2 可靠性 tcp 可靠性(握手、确认、重传机制) udp是不可靠,
3 有序性 tcp 是有序性(tcp利用序列号保证消息的顺序交互),udp是无序
4 速度 tcp 速度比较慢,因为要创建连接,保证消息的可靠性和有序性、udp 比较适合速度要去快的,如多人游戏和视频直播
5 量级 tcp 是重量级的(tcp重量级,体现在元数据的头tcp20字节,udp八个字节),udp是轻量级的

TCP滑动窗口

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输单元(MTU)/路径MTU 以太网帧格式 ICMP ARP RARP 03TCPIP基础(三) IP数据报格式 网际校验和 路由 04TCPIP基础(四) TCP特点 TCP报文格式 连接建立三次握手 连接终止四次握手 TCP如何保证可靠性 05TCPIP基础(五) 口协议 UDP特点 UDP报文格式 Linux网络编程之socket编程篇 06socket编程(一) 什么是socket IPv4套接口地址结构 网络字节序 字节序转换函数 地址转换函数 套接字类型 07socket编程(二) TCP客户/服务器模型 回射客户/服务器 socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 readn writen 回射客户/服务器 10socket编程(五) read、write与recv、send readline实现 用readline实现回射客户/服务器 getsockname、getpeername gethostname、gethostbyname、gethostbyaddr 11socket编程(六) TCP回射客户/服务器 TCP是个流协议 僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14socket编程(九) select 读、写、异常事件发生条件 用select改进回射服务器程序。 15socket编程(十) 用select改进第八章点对点聊天程序 16socket编程(十一) 套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数封装 17socket编程(十二) select限制 poll 18socket编程(十三) epoll使用 epoll与select、poll区别 epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 Linux网络编程之进程间通信篇 23进程间通信介绍(一) 进程同步与进程互斥 进程间通信目的 进程间通信发展 进程间通信分类 进程间共享信息的三种方式 IPC对象的持续性 24进程间通信介绍(二) 死锁 信号量 PV原语 用PV原语解决司机与售票员问题 用PV原语解决民航售票问题 用PV原语解决汽车租赁问题 25System V消息队列(一) 消息队列 IPC对象数据结构 消息队列结构 消息队列在内核中的表示 消息队列函数 26System V消息队列(二) msgsnd函数 msgrcv函数 27System V消息队列(三) 消息队列实现回射客户/服务器 28共享内存介绍 共享内存 共享内存示意图 管道、消息队列与共享内存传递数据对比 mmap函数 munmap函数 msync函数 29System V共享内存 共享内存数据结构 共享内存函数 共享内存示例 30System V信号量(一) 信号量 信号量集结构 信号量集函数 信号量示例 31System V信号量(二) 用信号量实现进程互斥示例 32System V信号量(三) 用信号集解决哲学家就餐问题 33System V共享内存与信号量综合 用信号量解决生产者消费者问题 实现shmfifo 34POSIX消息队列 POSIX消息队列相关函数 POSIX消息队列示例 35POSIX共享内存 POSIX共享内存相关函数 POSIX共享内存示例 Linux网络编程之线程篇 36线程介绍 什么是线程 进程与线程 线程优缺点 线程模型 N:1用户线程模型 1:1核心线程模型 N:M混合线程模型 37POSIX线程(一) POSIX线程库相关函数 用线程实现回射客户/服务器 38POSIX线程(二) 线程属性 线程特定数据 39POSIX信号量与互斥锁 POSIX信号量相关函数 POSIX互斥锁相关函数 生产者消费者问题 自旋锁与读写锁介绍 40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值