网络套接字3-1(三次握手为什么是三次;挥手为什么是四次;三次握手连接失败怎么办;TIME_WAIT:问题;服务端出现大量TIME_WAIT是什么原因;面向字节流;粘包问题的可能出现方式和预防措施)

UDP报文头部(源端口,目的端口,报头长度和数据长度和,校验和),有16位的校验和指的是一条数据通过sendto发送,数据到了传输层封装了UDP报头之后直接进行发送;对端收到UDP报文;对整个报文进行二进制反码求和(协议字段中的校验和),判断接受的报文是否和发送的一致;若数据一致表示这条数据可以交付给上层处理(当用户调用recvfrom能够获取数据);因为协议中有长度所以就会根据头部中的长度进行交付。因此面向数据报只能收发一整条,缓冲区不够就会报错。

因为报长度只用了两个字节来保存,因此最大65595(64k)字节的长度,要是发送的数据大于64k就会报错

因此要是数据过大需要用户在应用层分包处理,又因为UDP不保证数据的有序到达,因此需要用户在应用层进行包序管理。

在TCP通信里面,在客户端的连接请求发送过来之后,需要三次握手连接,在SYN请求发送过来之后,就会建立一个新的new socket(小桃红)然后回复ACK+SYN得操作就会交给new socket去完成。

关于三次握手为什么是三次而不是两次,或者四次的答复?

其实四次也可以,但是两次是绝对不可以的,因为关于三次握手可以解释为,第一次客户端发来SYN类比于问服务端你在
吗?服务端回复ACK+SYN类是在询问客户但是否具有收发数据的能力,然后客户端回复ACK接着就可以进行通信了,如
果只有两次的话,很有可能在客户端发送完第一次的SYN之后,然后由于网络延迟很久才到达了服务端这个时候客户端都
已经退出了,那么这个时候客户端在回复第二次之后,就开始数据的传送是不合理的。所以必需双方都确认具备有数据传
送能力之后才可以进行数据的传送。又或者第一次请求由于网络延迟超过了应答的时间这个时候,服务端再发一次SYN这
样加入第一次发的请求虽然延迟了但是还是到了服务端这样就会创建两个连接,浪费了资源。

举个例子,你去找你们隔壁的小朋友玩,然后你敲门问,在吗(第一次SYN请求),由于他在拉屎没及时回复,然后你走
了,等你走了之后,他说我再(第二次的ACK+SYN),但是你以为他不在你就走了,然后他说他在之后你也没回复他也就
没有开门,要是你没走的话,你就可以回复他我在(第三次ACK),然后他就来开门了(传送数据)。万一你邻居小朋友
最近耳屎有点多,她怕自己没听清,就在问,你真的在门口吗?你在回复在,这就是5次握手,所以说三次是最少握手三
次,才可以传送数据。

三次握手确认对方是否具备数据收发能力。

回答上面的问题主要基于安全回答,两次连接所建立的连接是不安全的。

关于挥手为什么是四次?
网络套接字3-1(三次握手为什么是三次;挥手为什么是四次;三次握手连接失败怎么办;TIME_WAIT:问题;服务端出现大量TIME_WAIT是什么原因;面向字节流;粘包问题的可能出现方式和预防措施)_第1张图片
四次挥手:被动关闭方接收到关闭请求之后,进行ack确认,但是操作系统需要用户处理完所有的数据之后才会调用close发送FIN请求。
三次握手连接失败怎么办?
三次握手失败通常指的是最后一次的ACK没有发送给服务端,那失败之后服务端如何处理?

虽然在网络基础2-2的时候我说了一个超时重传机制,但是那个只是在数据传输的时候有作用,在这一块是不一样的,在握手阶段服务端在最后一次ACK请求等了半天,然后就会给你发送一个RST报文,要求对方重新开始握手,将以创建的socket(小桃红)销毁掉。

有一种攻击就叫做SYN泛洪攻击,黑客找了很多的肉鸡(所谓电脑肉鸡,就是拥有管理权限的远程电脑。也就是受别人控制的远程电脑。肉鸡可以是各种系统,如win,linux,unix等;更可以是一家公司\企业\学校甚至是政府军队的服务器,一般所说的肉鸡是一台开了3389端口的Win2K系统的服务器,所以3389端口没必要开时关上最好。要登陆肉鸡,必须知道3个参数:远程电脑的IP、用户名、密码。),然后给一个服务器发送SYN请求但是不进行ACK回复,然后服务器同时就会具有很多的未完成连接的socket然后服务器就会瘫痪。

TIME_WAIT:问题:避免因为最后一次ACK的丢失对后续连接的影响
1.假如没有TIME_WAIT状态会出现什么情况?

如果没有TIME_WAIT的话,四次挥手最后一次ACK包如果丢失的话,那么客户端直接退出了,然后启用相同的端口和服务端进行连接的话就会使后续的连接刚上来就会收到服务端回复上一个客户端的请求重传的包,会引发混乱。其次是新起的客户端给服务端发送SYN连接请求之后,服务端还在等待上一次的ACK包,这样的话服务端会认为混乱,每一个状态都是为了等待下一步的操作。

2.解决了什么情况,为什么要等待两个SML?
(主要是为了防止对面让他重发第三次请求信息)
两次SML指的是两次最大的数据生存周期,两次SML等的是,假如服务端没有收到客户端发来的请求就会所以他等的就是第四次ACK发送那个过去之后,在网络中的最大生命周期,假如过了最大生命周期服务端还没有收到的话(这个是等的第一个SML),那么服务端就会重发第三次的FIN包,等待这个包在消失在网络中之前被自己接收,这个是等待的第二个SML。

服务端出现大量TIME_WAIT是什么原因,怎么解决?

TIME_WAIT是主动断开连接的一方才会产生TIME_WAIT,就是服务端主动断开连接,在服务端产生大量的TIME_WAIT,解决的办法就是缩短TIME_WAIT的时间,或者开启套接字选项,端口重用,一般写服务器的时候一般都会采用端口重用,确保安全。

可靠传输:连接管理,确认应答,超时重传,序号/确认序号,校验和
性能提高:滑动窗口机制,流量控制,快速重传,拥塞机制,延迟应答机制,捎带应答机制。

面向字节流:

对数据的收发按照字节为单位的流式传输

面向字节流的特性:传输比较灵活,发送端可以一点一点发,接收端也可以一点一点收,也可以,在缓冲区足够大的情况下,接收端可以先让数据堆积一会然后,再一个字节一个字节的读取。前提是缓冲区足够大。
但是有一个缺点就是容易产生粘包问题。

首先我们对TCP的粘包问题先来了解一下,TCP发送数据比较慢,在客户端和服务端各有一块socket缓冲区(一般建立socket之后会有两个缓冲区,一个是读缓冲区,一个是写缓冲区),然后服务端第一次发送了一个HELLO,第二次发送了一个WORLD,发送的数据会被拷贝到socket缓冲区,但是数据被没有被立即从缓冲区中拿走并且发送,而是停留在缓冲区,原因是要想发送这个数据,就需要TCP对这个数据进行一个封装,一个TCP的头部就有20-60个字节,用来发送5个字节的数据很不划算,所以他就会在缓冲区中等,在等要么缓冲区被写满,要么等待时间到了,就会把缓冲区中的数据统一拿出来再进行发送,这样的话数据被发送出去,等到客户端接到的话就是一条数据HELLOWORLD,但是客户端并不知道其实这个是服务端发送的两条数据,有可能用户应用的时候发生错误。这个是产生粘包的一个原因,是因为一端的缓冲区发送太慢引起的,同理还有一个产生粘包的原因是因为,在接收端的将缓冲区,也不会被立即读走,等到缓冲区满了之后,就会引起多个数据的粘包。

两个产生可能一个是来不及读引起的,一个是来不及写引起的。所以说TCP粘包既有可能在发送端产生又有可能在接收端。

那么问题来了TCP为什么会粘包。

在这个之前我们先来说一下,UDP为什么不会粘包,因为UDP在缓冲区中存数据的时候,每往缓冲区里面放一条数据就会给他封装一个UDP的头部,UDP的头部中又有16位的UDP头长度和数据长度的和,那么等到数据发送过去之后,读方从缓冲区中拿数据的时候,看到长度他就知道这一条数据到底有多长,他就会一次性把一条完整的数据从缓冲区中拿出来。所以UDP不会粘包。

TCP产生粘包就是内核内核并没有对send要发送的数据进行明确的边界区分。
那么就需要用户在应用层进行解决。怎么解决粘包问题?

  • 1.在应用层给数据增加特殊字符进行间隔,
  • 2.或者给数据定长,固定每条数据多长
  • 3.不定长数据的应用协议头中定义数据长度(采用UDP的方法)

TCP连接管理中的保活机制:
TCP协议栈内部实现保活机制:
长时间无数据通信,则发送保活探测包;若多次保活探测都无回复;则认为连接断开;

TCP连接断开的体现:
recv返回0 ;send触发SIGPIPE异常
TCP只有断开连接的时候才会返回0,发生错误一般都是返回-1
close—退出进程—关机(正常关机)
突然断电就会使得一端断开,这样的话就会使得看另一方的socket无意义,发送 保活探测包之后就会断开连接

基于TCP协议实现的应用层协议:HTTP/ftp

UDP如何实现可靠传输:UDP是无法实现应答传输的,但是如果要实现可靠传输的话,就要模仿TCP的各种东西,这些都是需要在应用层实现的。

了解LINUX下的tcpdump抓包工具

使用方法为 	sudo tcpdump -i ens33 将流经ens33网卡的包全部抓取
  		sudo tcpdump -i ens33 -w a.pcap  将抓到的包写入一个文件保存

网络基础3:网络层,链路层
网络层:负责地址管理与路由选择;

路由选择指的是,在复杂的网络传输环境中,对数据的传输选择一条合适的路径,依赖于地址管理,地址管理不好,就没办法路由。

主要讲解地址管理。

主机:个人pc设备

路由器:路由转发设备

节点:网络中的任意设备

如何在LINUX中查询运营商的服务器IP,以QQ为例:ping www.qq.com就可以弹出IP地址

IP地址不能随意的分配,因为随意分配就有很大的概率造成IP地址的冲突(数据无法发送)
解决方法:将IP地址的分配规范起来
每个路由器都能够组建一个局域网,这个局域网就应该具备自己的网络标识符(网络号),这个路由器向自己组建的局域网中的主机分配的IP地址都应该包含这个网络标识;同时为了在局域网中能够唯一的标识一台主机,IP地址中还应该包含主机标识(主机号)
由此可知IP地址组成::网络号+主机

IP地址的分配规范起来之后,只需要对网络号的取值进行规范就可以了:相邻的网络不能具备相同的网络号。

一个路由器上相连的所有网络(一个路由器上可能连着下线路由器)网络号不能相同,因为这些网络都属于相邻网络,数据到了路由器之后,一旦网络号冲突就会导致路由器不知道数据该给谁给
我们的主机连自己的路由器,自己的路由器又连接运营商的路由器,然后才连接到互联网。
网络套接字3-1(三次握手为什么是三次;挥手为什么是四次;三次握手连接失败怎么办;TIME_WAIT:问题;服务端出现大量TIME_WAIT是什么原因;面向字节流;粘包问题的可能出现方式和预防措施)_第2张图片

你可能感兴趣的:(Linux)