TCP/IP如何确保网络通讯质量

前言

我写这篇博客主要讲解的是tcp/ip协议通讯,大部分只涉及了网络层和传输层,不够特别深入也不直接搬运,是对上个星期学习到的知识总结;还有就是秀一下努力之后的UML图表。有些是自己的总结,如果有发现问题的同学,还请提出,大家共同进步

网络通讯基础

tcp/ip模型
在tcp/ip模型
WAN/VLAN通讯(ip/router)
WAN/VLAN通讯

子网掩码(netmask)–同一子网内可以连网
参考博客
概念:子网掩码就是将某个IP地址划分成网络地址和主机地址两部分

例子:如果子网掩码设置为255.255.255.252,那么该子网只能容纳两台电脑,而且这两台电脑的IP必须在一个子网内才能正常联网,例如一台电脑的IP设为192.168.1.10,另外一台电脑的IP必须设置为192.168.1.9。

10.240.176.128/25
	129.168.1.1 /24 这个24就是告诉我们网络号是24位(24个1):子网掩码是:11111111 11111111 11111111 00000000
	ip地址一共是32位,/24就表示他的网络号是24位,也就是说共有2^(32-24)-2个主机(因为主机为全0和全1的保留不用,所以需要减2),共254个ip

根据子网掩码可以分割网络号+主机号
255.255.255.224 转二进制:
	11111111 11111111 11111111 11100000
	网络号有27位,主机号有5位
	网络地址就是:把IP地址转成二进制和子网掩码进行与运算
	11001010 01110000 00001110 10001001

IP地址&子网掩码
	11001010 01110000 00001110 10001001
	11111111 11111111 11111111 11100000
	------------------------------------------------------
	11001010 01110000 00001110 10000000:网络地址--202.112.14.128

network segment

网段地址:一个计算机网络中使用同一物理层设备(传输介质,中继器,集线器等)能够直接通讯的那一部分。

广播地址(Broadcast Address):专门用于同时向同一网段中的所有工作站进行发送的一个地址。

DNS(域名解析)–连网
connect network

TCP/UDP的应用

TCP(Transmission Control Protocol,传输控制协议))

TCP协议的特点是:面向连接、字节流和可靠传输。

Tcp数据结构
tcp struct

源端口和目的端口
	源端口和目的端口分别代表呼叫方和被呼叫方的TCP端口号,各占16位。一个端口与主机的IP地址就可以
	完整地标识一个端点了,也就是构成套接字(Socket)。
	
序号(Sequence Number)
	序号指TCP数据段中的“数据”部分(不包含“数据段头”部分)的第一个字节的编号,占32位。在一个TCP连接中,
	传送的数据字节流的每一个数据字节都要按顺序进行编号,在“数据段头”中标识的只是每个数据段的第一个数据字节的编号。
	整个要传送的字节流的起始序号必须在连接建立时设置。例如,一个数据段的“序号”字段值是101,而该数
	字段中共有100个字节,表明本数据段的最后一个字节的编号是200。这样一来,下一个数据段的。这样以来,
	下一个数据段的“序号”字段值应该是201,而不是102,这点要注意。
	
确认号
	确认号指期望接收到对方下一个数据段中“数据”部分的第一个字节序号,占32位。注意,“确认号”不是代表
	已经正确接收到的最后一个字节的序号。例如,主机B已收到主机A发来的一个数据段,其序号值是101,而该数据
	段的长度是100字节。这表明主机B已收到主机A前200个字节,下一个期望要收到的数据段的第一个字节的序号
	应该是201,于是主机B在给主机A发送确认数据段时要把“确认号”设置为201。 
	"序号”和“确认号”两个字段共同用于TCP服务中的差错控制,确保TCP数据传输的可靠性。
	
窗口大小
	指示发送此TCP数据段的主机上用来存储传入数据段的窗口大小,也即发送者当前还可以接受的最大字节数,
	占16位。TCP的“窗口大小”字段与CDT一样是使用可变大小的滑动窗口协议来进行流量控制。“窗口大小”字段
	的值告诉接受本数据段的主机,从本数据段中所设置的“确认号”值算起,本端目前允许对端发送的字节数,
	是作为让对方设置其发送窗口大小的依据。假设本次所发送的数据段的“确认号”字段值501,而“窗口大小”字段值是100,
	则从501算起,本端还可以接受100字节(字节号是501~600)

面向连接
概念:网络系统需要在两台计算机之间发送数据之前先建立连接的一种特性。(SYN/FIN)

TCP Flags:
	SYN表示建立连接,
	FIN表示关闭连接,
	ACK表示响应,
	PSH表示有 DATA数据传输,
	RST表示连接重置。

三次捂手/四次挥手
可靠性
字节编号机制(序号)。
TCP 数据段以字节为单位对数据段中的“数据”部分进行一一编号,确保每个字节的数据都可以有序传送和接受。

数据段确认机制(确定号)。
TCP要求每接受一个数据段都必须由接收端向发送端返回一个确认数据段(可以用一个确认数据段一次确认全面多个数据段),其中的“确认号”表明接收端已正确接受的数据段序号(“确认号”前面的所有数据段,确认号表示将要接收的下一个数据段编号)。

超时重传机制。
在 TCP 中有一个重传定时器(Retransmission Timer, RTT),在发送一个数据段的同时也启动了该定时器。如果在定时器过期之前该数据段还没有被对方确认的话,且定时器停止,然后重传对应序号的数据段。

选择性确认(Selective ACK, SACK)机制。
在 SACK 支持下,仅可以重传缺少部分的数据,而不会重传那些已经正确接受的数据段。

Tcp字节流
在这里插入图片描述
网络数据流的地址规定:
先发出的数据时低地址,后发出的数据是高地址。发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,为了不使数据流乱序,接收主机也会把从网络上接收的数据按内存地址从低到高的顺序保存在接收缓冲区中。

tcp粘包/解决办法

概念:是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往往小于在应用处理的消息数据,所以就会引发一次接收的数据无法满足消息的需要,导致粘包的存在。

解决办法:
1)格式化数据:每条数据有固定的格式(开始符、结束符),这种方法简单易行,但选择开始符和结束符的时候一定要注意每条数据的内部一定不能出现开始符或结束符;
2)发送长度:发送每条数据的时候,将数据的长度一并发送,比如可以选择每条数据的前4位是数据的长度,应用层处理时可以根据长度来判断每条数据的开始和结束。

滑动窗口协议–控制tcp数据传输的速度

在这里插入图片描述
概念:用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量。

模拟发送过程:
1.发送建立连接之后,发送方直接将0,1,2的3个帧一次从(A)发送;此时(B)只让帧0通过,则帧1,2还在网络中;滑动窗口向右移一个帧位置
2.发送方再将帧3从(A)发送,此时(B)只让帧1通过,则帧2,3还在网络中;滑动窗口向右移一个帧位置...直到全部接受完成

UDP(User Datagram Protocol,用户数据报协议)

UDP协议的特点是:无连接、数据报和不可靠传输。
UDP数据结构
在这里插入图片描述
在这里插入图片描述
数据报的长度:指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)
校验值:校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。

无连接
传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

数据报
发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

不可靠
UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。

TCP/UDP的比较

TCP:流式,需要建立连接,复杂,可靠,有序(大量数据传输:https/http/ftp/telnet....)
UDP:单个数据报,无需建立连接,简单,不可靠,无序(一次传输少量数据:QQ/音频/视频...)

Socket通讯

一、理解socket

1、socket即为套接字,在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一的标识网络通讯中的一个进程,“IP地址+TCP或UDP端口号”就为socket。 
2、在TCP协议中,建立连接的两个进程(客户端和服务器)各自有一个socket来标识,则这两个socket组成的socket pair就唯一标识一个连接。 
3、socket本身就有“插座”的意思,因此用来形容网络连接的一对一关系,为TCP/IP协议设计的应用层编程接口称为socket API。

Socket可以看成是在两个网络应用程序进行通信连接时的一个端点(或者称为“逻辑接口“),它是连接应用程序和网络驱动程序的桥梁,
在TCP/IP通信中,应用程序把数据传送给Socket,然后由Socket通过传输层向下提交给网络驱动程序并向网络上发送出去。计算机从网络上收到与该Socket绑定IP地址和端口号相关数据后,由网络驱动程序通过传输层向上提交给应用层的Socket,最后应用程序从Socket中提取所要接受的数据

python实现socket通讯

推荐博客
TCP 详解
Network——Socket网络通信机制以及实现举例(TCP、UDP等)
参考博客
Linux 之 TCP 协议详解
IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值