Linux网络编程(传输层协议 )—tcp三次握手/四次挥手
传输层协议:负责应用程序之间数据传输-TCP/UDP
UDP协议:
16位源端-对端端口:用于描述识别通信两端进程
16位数据报长度:能够存储最大数字 65535,(udp报文总大小不超过64k)
16位校验和:二进制反码求和算法——校验接收方接收到数据与发送方发送数据是否一致
协议特性:
- 无连接(只要知道对端地址即可直接发送)
- 不可靠(不保证数据安全,不保证数据有序到达对端)
- 面向数据报:无连接,不可靠,无序,有最大长度限制的传输方式
注:
udp传输时,sendto发送的数据会被放到发送缓冲区,udp直接从缓冲区读取并封装头部后发送
udp传输时,接收的数据会被放到接收缓冲区,udp解析8字节头部获取数据长度,实现整条数据交付,不会出现半条或多条交付
所以在编程过程中:为了规避udp缺点
1,,不保证安全达到:需要在应用层使用tcp部分机制
2,不保证有序到达:需要在应用层进行包序管理
3,udp报文有最大长度限制:报文最大长度小于64k,因此发送大块数据时,需要在应用层进行数据分包进行发送
4,udp实现整条交付,不存在粘包问题:因此缓冲区需要足够大,能够存放整条数据
TCP协议:
协议特性:
- 面向连接:连接管理+状态管理
- 握手三次,挥手四次
tcp是一个全双工通信,两端都必须确认对方是否具有数据收发能力,因此握手两次不安全,四次没必要
fin包只能表示对方不在发送数据了,不代表对方不再接收数据,因此有可能被动关闭方还会继续发送数据,因此这种情况下就不能直接发送fin包,而是等待上层用户不在发送数据了,等调用close被动方关闭才会发送 fin,表示被动方也不再发送数据,经过双方都确认后再关闭
- 三次握手失败的处理:
服务端发送syn+ack后,如果超时等不到客户端的ack确认,会发送rst重置连接报文,释放新建套接字
- TIME_WAIT作用:
TIME_WAIT是主动关闭方在关闭连接过程中进行最后一次回复ack后进入的状态
如果被动关闭方没有收到最后一次回复,则会重传fin,若没有TIME_WAIT,主动关闭方最后一次回复(ack)则直接释放资源,此时如果客户端重新启动一个套接字刚好为之前地址信息,这个套接字可能会接收到重传的fin导致新连接也受影响,主要是保护客户端,不会使用刚关闭的套接字地址信息,从而受到上一个套接字通信遗留问题影响
TIME_WAIT等待2个msl时间(2*60s)之后,释放资源,保证能够对重传的fin进行处理,以保证本次通信的所有数据都消失在网络当中不会对新连接造成影响
- 一台主机出现大量TIME_WAIT
TIME_WAIT是套接字主动关闭连接后进入的状态,因此大量TIME_WAIT意味大量套接字关闭
解决方法:(1)减少TIME_WAIT时间 (2)使用套接字选项setsockopt(SO_REUSEADDR):地址复用(进入TIME_WAIT的地址可以直接使用,服务端关闭后可重启)
- 一台主机出现大量CLOSE_WAIT
CLOSE_WAIT是被动关闭方收到fin包进行ack回复之后进入的状态 这个状态是在等待被动关闭方的上层用户调用close/shutdown后再次发送fin包
一台主机出现大量CLOSE_WAIT意味着代码中没有调用close/shutdown关闭套接字
tcp连接保活机制:
通信两端在长时间没有数据通信的情况下,服务端会每隔一段时间向客户端发送一个保活探测数据包(要求对方进行回复),若连续多次没有收到回复,则认为连接已断开
默认7200s没有数据通信会每隔75s发送保活数据包 9次无回复则连接断开
连接断开对程序的影响:recv返回0 send会触发SIGPIPE异常
- 可靠传输:保证数据有序安全到达对端
1,面向连接,基于连接,确保通信双发都具有收发数据能力
2,协议字段中的序号和确认序号,进行包序管理,实现有序传输
3,确认应答机制:接收方针对收到的每一条数据进行确认回复(认为之前的数据都是准确有序的)
4,超时重传机制:发送数据等待超时无回复后,认为数据丢失进行重传
(1)停等协议:收到确认回复后才会发送下一条
(2)回退n步协议:从丢失的数据开始进行重新传输
(3)选择重传协议:哪一条丢失,重传哪一条
5,协议字段的校验和字段:校验数据一致性,不一致则丢弃,发送重传请求
6,过程中避免丢包
(1)发送数据过快过多导致接收方缓冲区满溢而丢包
解决方法:滑动窗口机制(依赖协议字段中窗口大小字段实现) 流量控制
每一方都有一个:接收窗口,发送窗口 (前沿-后沿)<对方窗口大小
发送窗口:前沿:起始发送序号 后沿:结束发送序号
接收窗口:前沿:起始接收序号 后沿:结束接收序号
(2)网络信号不好,导致大量丢包重传
解决方案:拥塞机制 以慢启动快增长的形式进行传输
发送方维护一个拥塞窗口,用于限制当前能发送的数据大小,而这个拥塞窗口以指数层级增长,实现网络探测,防止传输过程中网络状态突然变差继续大量发送导致的大量丢包
7,性能提升
(1)确认序号:告诉发送方确认序号之前的所有数据都已经接受成功,避免因为中间的某个确认回复丢失而导致的重传
(2)快速重传:减少超时等待时间
接收方在接受数据时,先接收到了后发的数据,则认为前边的数据有可能丢失,则连续间隔发送三条前边数据的重传请求(确认序号为丢失的数据起始序号)
发送方收到三条连续重传请求(防止延迟到达的误判),则将对应确认序号的数据重传
(3)延迟应答机制:接收到数据后,延迟确认回复
接收方接收数据后如果立即回复,上层尚未将数据取出导致滑窗大小会减小,延迟期间,上可能会将数据取出,恢复滑窗大小,保证窗口大小,保证传输吞吐量
(4)捎带应答机制:将确认回复信息放到即将要发送的数据报头中,捎带一块传输给对方,尽量减少纯报头的回复确认
总结
tcp如何实现可靠传输?
1,可靠传输:面向连接,包序管理,确认应答,超时重传,校验和
2,避免丢包:滑动窗口流量控制,拥塞机制(慢启动快增长)
3,提高性能:快速重传,延迟应答,捎带应答
udp如何实现可靠传输?
在应用层依靠tcp实现可靠传输的机制来实现
- 面向字节流 :有序可靠双向基于连接的 字节流传输,没有大小限制,以字节为单位
tcp将要发送的数据放在发送缓冲区,通信时tcp会从缓冲区取出合适大小数据(不大于mss大小)进行头部封装发送
优点:(以udp面向数据报比较)传输灵活
缺点:产生粘包问题,将许多数据当一条数据来处理
本质原因:tcp不维护数据边界
解决方法:应用层进行数据边界管理(特殊字符间隔(http:\r\n),数据定长,应用层头部加数据长度字段eg:http(Content-Length))
Linux网络编程(传输层协议 )—tcp三次握手/四次挥手相关推荐
- 网络架构,七层协议,三次握手四次挥手,socket套接字简单编程
一.单机架构 应用领域: 植物大战僵尸 office 二.CS架构 应用领域: QQ 大型网络游戏 计算机发展初期用户去取数据,直接就去主机拿,从这里开始就分出了客户端和服务端. 客户端:用户安装的软 ...
- 划重点 传输层协议 tcp三次握手和四次挥手
文章目录 传输层的协议 1.TCP/IP协议组的传输层协议 2. TCP报文段 3.TCP建立连接的过程 3.2 TCP常用端口号及其功能 4.UDP协议 4.1 UDP报文的首部格式 4.2 UDP ...
- 【Linux网络编程】浅谈 TCP 三次握手和四次挥手
三次握手 在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等 ...
- Linux_网络_传输层协议 TCP通信滑动窗口(快重传),流量控制,拥塞控制(慢启动),延迟应答,捎带应答,TCP常见问题(字节流,粘包),Listen半连接队列
紧跟Linux_网络_传输层协议 TCP/UDP继续补充 文章目录 1. TCP通信时滑动窗口(效率) 2. 流量控制(可靠性) 3. 拥塞控制(慢启动) 4. 延迟应答 5. 捎带应答(提高通信效率 ...
- java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)
文章目录 前言 一.网络编程概述 二.网络通信要素概述 1.如何实现网络中的主机互相通信 2.网络通信协议 3.IP和端口号 4.InetAddress类 5.网络协议 6.TCP/IP协议簇 7.T ...
- TCP三次握手四次挥手简介
TCP三次握手四次挥手简介 图解三次握手.四次挥手 建立连接:三次握手 关闭连接:四次挥手 上图传递过程中出现的几个字符(SYN,ACK,FIN,seq,ack)各代表什么意思 SYN,ACK,FIN ...
- 【网安】初学者,第一天day1 (什么是域名,常见的端口和协议,三次握手四次挥手)
网安小白第一天 了解什么是域名,常见的端口和协议,三次握手四次挥手 第一次接触网安,从0到1. 一.域名 1.定义 域名是用于在识别和定位Internet上计算机的层次结构式的字符标识,它对应于计算机 ...
- TCP三次握手四次挥手详解
TCP三次握手四次挥手 1. TCP报文格式 2. TCP连接需要解决的问题 3. 三次握手 4. 四次挥手 5. 一些补充问题 1. TCP报文格式 在了解三次握手和四次挥手之前,先知道TCP报文内 ...
- java锁一次交互二次握手_Java后台开发面试实战(二):TCP三次握手四次挥手
感谢牛客网网友提供的面试经验! 1. 解释一下TCP三次握手四次挥手 图片来源于微信公众号:码农求职小助手 答: 嗯(稍作思考)- 三次握手简单来说,在数据传输开始前: 第一次握手:客户端向服务端发送 ...
- [计算机网络][总结][常见问题][TCP][三次握手][四次挥手]
TCP三次握手 四次挥手 三次握手 目的:保证传输的可靠性,为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误.主要防止资源的浪费. 具体过程:当客户端发出第一个连接请求报文段时并没有丢 ...
最新文章
- webElement.text()获取到内容为空
- 后端常用开源组件合集(持续更新中)
- 网站收录的提升离不开“方法”和“坚持”
- Java Spring MVC框架搭建(一)
- c语言常用指令翻译,c语言常见专业词汇带翻译
- 北京大学数字视频编解码技术国家工程实验室开源AVS2高清实时编码器
- SAP UI5 应用开发教程之五十五 - 如何将本地 SAP UI5 应用通过 Node.js Express 部署到公网上试读版
- 谈谈你对IOC的理解
- 使用Apache Camel 2.14的轻松REST端点
- 【机器视觉学习笔记】双线性插值实现图片任意角度旋转(C++)
- ionic轮播,滑动之后不进行轮播
- 深入了解Cookie(1)------selenium2进行Cookie操作的前奏
- android 系统重装,手机系统重装教程[多图]
- 总成绩和平均分计算------C语言
- 前端性能优化 之 首屏预渲染
- 利用powershell安装360杀毒
- hexo笔记十一:next主题添加留言页面
- 使用 Hadoop 开发企业级应用
- 关于找工作的鸡零狗碎
- 安卓系统最好用的5款epub阅读器