网络编程(一)

一、网络编程涉及

网络模型、套接字、数据包

二、什么是网络编程 

如何达到上图的效果:

1、如何准确的定位网络上的一台主机 :ip+端口号,定位到这个计算机上的某个资源

比如说:定位到qq这个资源[打开任务管理器]

地址为 192.168.247.1 : 9576

Javaweb:网页编程 B/S

网络编程:TCP/IP C/S

三、网络通信的要素

 如何实现网络的通信

通信双方地址:

  • ip
  • 端口号

规则:网络通信的协议 -------------

udp tcp

TCP/IP参考模型

四、IP

  • IP地址由四段组成,每个字段是一个字节,即4个字节、  每个字节有8位,最大值255(2的8次方=256 :0~255)。
  •  全世界范围是唯一的 32 位(4个字节 * 8位)的标识符。
  •  IP地址由两部分组成,即网络地址和主机地址,二者是主从关系:

           1. 网络号 net-id,它标志主机(或路由器)所连接到的网络,网络地址表示其属于互联网的哪一个网络

            2.主机号 host-id,它标志该主机(或路由器),主机地址表示其属于该网络中的哪一台主机。

      两级的 IP 地址可以记为:   IP 地址 ::= { <网络号>, <主机号>}   

      简而言之就是:IP地址 = 网络号+主机号

IP地址:InetAddress

  • 唯一定位一台网络上计算机
  • 127.0.0.1:本机localhost
  • ip地址的分类 

          ---ipv4/ipv6

                #ipv4:127.0.0.1   4个字节组成。0~255 ,

                #ipv6:240e:398:6898:5370:697a:e652:a96f:ae2c   128位。8个无符号整数!

                区别:

IPv4是32bit的地址,无论公网地址还是私网地址,联网设备需要提前设置好自己的IP地址或者通过DHCP协议向对应的服务器获取可用IP,理论上IPv4只拥有2^32-1个可用地址。去掉私网地址、组播地址、划分子网后的广播地址和网段地址,公网地址数量大大小于2^32-1的个数,也就导致了目前IPv4公网地址稀缺的问题。

IPv6则是128bit的地址,也就是说,理论上IPv6地址的数据是IPv4的2^96倍,并且IPv6可以通过入网设备的MAC地址生成链路本地地址。而且IPv6对组播和对流的支持比IPv4强。由于历史原因,IPv4并没有考虑网络安全性,而IPv6可以对网络层的数据进行加密。

               # 公网(互联网)--私网(局域网)

                        ~ABCD类地址:      

               ~IP地址分类(ABCDE)

                                    @IP由网络地址和主机地址

                                    @ 网络地址: 其属于互联网的哪一个网络

                                    @主机地址: 属于该网络中的哪一台主机。

                                    @ IPv4的长度32位,4字节

A、B、C三类及特殊D、E。全0和全1的都保留
A:(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0

  • 网络号取值于1~126
  • 大型网络

B:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0

  • 该类IP地址的最前面为“10”,
  • 网络号取值于128~191
  • 中等规模

C:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0

  • 该类IP地址的最前面为“110”,
  • 网络号取值于192~223
  • 小型网络

D:是多播地址。

  • 该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。
  • 用于多路广播用户

E:是保留地址。

  • 该类IP地址的最前面为“1111”,
  • 网络号取值240~255

私有地址

  • A类:10.0.0.0~10.255.255.255
  • B类:172.16.0.0~172.31.255.255
  • C类:192.168.0.0~192.168.255.255
  • 回送地址:127.0.0.1。 也是本机地址,等效于localhost或本机IP。一般用于测试使用。

                ping 127.0.0.1来测试本机TCP/IP是否正常。

特殊说明

  •         每一个字节都为0的地址(0.0.0.0)对应当前主机。
  •         IP地址中的每一个字节都为1的IP地址(255.255.255.255)是当前子网的广播地址。
  •         IP地址中凡是以11110开头的E类IP的地址,都保留用于将来和实验使用。
  •         网络号的第一个8位不能全为0。
  •         IP地址不能以127为开头,该类地址中数字127.0.0.1~127.255.255.254用于回路测试。
     

 ~192.168.xx.xx ,专门给组织内部使用的

五、端口

  • 端口表示计算机上的一个程序的进程
  • 不同的进程有不同的端口号!用来区分软件!
  • 被规定:0~65535
  • TCP、UDP:65535*2   若tcp:80 udp也可为:80【单个协议下,端口号不能冲突】
  • 端口号的分类:

        公有端口 0~1023 【比如:HTTP:80,HTTPS:443,FTP:21,Telent:23】

        程序注册端口:1024~49151,分配用户或者程序【例如:Tomcat:8080,mysql:3306等】

        动态、私有:49152~65535

netstat -ano #查看所有的端口
netstat -ano|findstr "5900" #查看指定的端口
tasklist|findstr "8080" #查看指定端口的进程


六、通信协议

协议:约定,就好比我们现在说的是普通话

TCP/IP协议簇:实际上是一组协议

  • TCP:用户传输协议
  • UDP:用户数据报协议

TCP 与 UDP 的对比

TCP:打电话,要确实对方接通,才可以进行交流

  •         连接、稳定
  •         客户端、服务端
  •         传输完成,释放连接,效率低
  •         三次握手,四次挥手

专业术语:

TCP报文格式
首部有20字节的固定长度,含义如下:

源端口和目的端口
各占2字节,就是存储源端口号和目的端口的

序号seq
占4字节,表示的范围就是整形的范围[0~2^32]。序号使用在给数据部分每个字节进行编号的,编号方式是mod 2^32 。

确认号ack
占4字节,范围也是无符号整数的范围。使用在对端传输给我的数据最后一个字节序号,例如A传输给B 101—500,此时B返回的确认号一定是小于等于501的。当B段正确接收数据之后才会返回确认号,换句话说确认号之前的数据已经全部接收。

数据偏移
占4bit,数据偏移很多人很容易想到是不是表示数据的长度,那就错了。偏移嘛,指的是TCP起始位置到数据部分的起始位置的偏移,也就是TCP首部的长度。

保留
占6bit,保留字段顾名思义,就是为今后使用,默认置为0。

紧急URG控制位
占用1bit,URG=1,表示紧急指针有效,此时tcp数据优先传输。相当于生活中的紧急通道,特殊情况时使用。在网络中也会有特殊情况,例如,发送一个很长的程序在远程服务器上运行,此时发现程序有bug,需要中断运行,因此我们从键盘输入Ctrl c,假如不使用紧急数据,需要在缓冲区里排队,都知道是bug了,还要排队,这怕是要出锅啊。此时使用紧急数据传输,不需要排队,直接中断程序是不是更符合我们的预期。需要注意一点是,即使窗口为0时,也可以发送紧急数据。

  • 如何使用紧急URG控制位,在socket编程中send函数flag参数
  • send(int socket, const void *buffer, size_t length, int flags);
  • flags参数传MSG_OOB宏时,表示此时有紧急数据。MSG_OOB是个宏,

确认ACK
占1bit,当ACK=1时生效。TCP有条硬性规定,当建立链接成功后所有传输的数据报文都必须把ACK置为1。

推送PSH
占1bit,发送方把PSH置为1时 会立即发送该数据包,接收方收到PSH=1的报文会立即处理交付给应用层处理。是不是感觉和URG很像,其实还是有些区别的。

两者相同点:
URG与PSH两者都使用于紧急处理的情况,用来快速传输紧急数据。

两者不同点
URG置为1时,对于发送发,“带外数据”与正常情况下应该发送的消息数据一起,封装成数据报发送,省去了在队列中等待的时间。 在接收方,解析报文后,获取数据之后还是要放在缓存区中,等待满了之后在向上往应用层交付。

PSH置为1时,对于发送方,表明这些数据不需要等向下发送的缓存区满,立刻封装成报文,发送,省去了等待发送缓存区到达满的状态的时间。 在接收方,也不需要等接受缓存区满,直接向上交付给应用层。

复位RST
占1bit,当RST=1时,TCP会主动释放链接,两种情况会用上。TCP出现严重差错时,会主动释放连接,重建链接,传输数据。遇到非法报文或者拒绝连接时会把RST置为1.

同步SYN
占1bit,同步控制位,用来在传输连接建立时同步传输连接序号。SYN=1时,表示这是一个连接请求或连接确认报文。SYN=1,ACK=0,表明这是一个连接请求数据段,如果对方同意建立连接,则对方会返回一个SYN=1、ACK=1的确认。

FIN控制位
占1bit,用于释放一个传输连接。FIN=1时,表示数据已全部传输完成,发送端没有数据要传输了,要求释放当前连接,但是接收端仍然可以继续接收还没有接收完的数据。FIN=0,正常传输数据。

窗口大小
占16bit,2byte,用于表示发送方可以接受的最大数据大小。该窗口是动态变化的,用作流量控制时使用。

检验和
占16bit,2byte,用于对TCP头部,伪头部,数据三个部分进行校验。

紧急指针
占16bit,2byte,用于记录紧急数据的末尾在数据段中的位置。当URG=1时,该指针才生效。

可选项
可选项最长可达40byte,是可选的,可以没有。当可选项不存在时,TCP头部长度为20byte。可选项可以包括窗口缩放选项(Window ScaleOption,WSopt)、MSS(最大数据段大小)选项、SACK(选择性确认)选项、时间戳(Timestamp)选项等。

数据
TCP数据部分,由应用层应用程序提交的数据。TCP头部是基础知识,必须了解才能更好的理解TCP数据如何封装和传输,以及在建立链接和断开链接时都在操作那些地方。

 三次握手如何建立连接?

采用C/S模式解释,假设C端发起传输请求。

在发送建立链接请求之前,C端是保持CLOSED状态,S端最开始也是处于CLOSED状态,当执行listen函数套接字进入被动监听状态。

所谓被动监听,是指当没有客户端请求时,套接字处于“睡眠”状态,只有当接收到客户端请求时,套接字才会被“唤醒”来响应请求。

第一次:C端发送SYN=1的请求报文,此时C端进入SYN SENT状态,等待服务器确认。

此时如果报文丢失发送不到对端会如何?

C端发送报文之后会启动一个定时器,在超时之后未收到S端的确认,会再次发送SYN请求,每次尝试的时间会是第一次的二倍,如果总的总尝试时间为75秒,此次建立链接失败。

第二次:S端收到C端发送的SYN报文(建立链接请求)后,S端必须返回确认号并且同时发送一条SYN报文,此时进入SYN RCVD状态。

为啥要连带发送SYN报文?

TCP是全双工通信,协议规定当收到建立链接请求后必须返回序列号,同时建立本端到对端的通信链接。这也叫做捎带应答机制。

如果第二次报文丢失怎么办?

在发送完ACK+SYN报文后会启动一个定时器,超时没有收到ACK确认,会再次发送,会进行多次重试。超时时间依旧每次翻倍,重试次数可设置。

修改 /proc/sys/net/ipv4/tcp_synack_retries 的值

第三次:C端收到S端发的ACK+SYN报文,需要返回一个应答ACK的报文,此时该连接会进入半连接状态的队列,当S端收到ACK后,一条完整的全双工TCP链接建立完成,双方进入ESTABLISHED状态。

这里有个常用攻击手段,攻击者伪造一个SYN请求发送给服务端,服务端响应之后,会收不到C端的ACK确认,服务端会不断的重试,默认会重试五次。

此时服务端会维持这个链接的所有资源,如果有大量这样的请求,服务端的资源会被耗完。

这就是DOS攻击。

如果第三次报文丢失怎么办?

S端在发出ACK+SYN报文后会启动一个定时器,在超时触发还没收到ACK就确认是丢失了,会重试一次发送

为什么需要三次握手建立链接,2次可以么,4次行不行?

如果第二次不发送SYN+ACK,只是发送确认应答消息ACK,会造成只能建立单向通信,而且不能应答。而TCP是全双工通信的,而且必须保证可靠性。

如果第二发送SYN+ACK,不用应答。此时会出现三种情况

一、二次握手失败,C端会重复发送SYN报文,等待对端发送确认报文,S端会保存tcp连接的所有资源,大量的这种情况会导致S资源耗尽。

二、二次握手成功,S收不到ACK会重复发送SYN+ACK报文。

三、二次握手完以后,双方以为连接建立成功,即可开始通信。假如此时连接并没有真的建立成功,S端开始发送消息,会造成网络拥堵发生。

四次其实原则上来说是可以的,就是把第二次的ACK和SYN分两次发送。在理论上是完全可以行得通的,但是TCP本着节约网络网络资源的前提。

还有一种是不拆开二次握手的捎带应答,三次握手之后C端继续发送SYN报文,其时这是徒劳的。第三次完成以后链接已经建立,后面无论多少次都是徒劳。

TCP同时建立链接

这就是双方同时建立链接的情况,情况还不错,反正能建立成功,这点是肯定的。但是要注意两点

第一、此时只会建立一条全双工的TCP链接,不是两条。

第二、双方没有CS之分,两端都是同时承担两个角色,客户端和服务器。

四次挥手断开链接


依旧采用C/S模式解释此过程。

第一次:当C端的应用程序结束数据传输是,会向S端发送一个带有FIN附加标记的报文段(FIN表示英文finish),此时C端进入FIN_WAIT1状态,C端不能在发送数据到S端。

第二次:S端收到FIN报文会响应一个ACK报文,S端进入CLOSE_WAIT状态。进入此状态后S端把剩余未发送的数据发送到C端,C端收到S端的ACK之后,进入FIN_WAIT2状态。

同时继续接受S端传输的其他数据包。

第三次:S端处理完自己待发送的数据之后,也会发送FIN断开链接的请求,S端进入LAST_ACK状态。

第四次:C端收到S端的断开链接请求后会启动一个定时器,该定时器时长是2MSL(最大段报文生存时间),同时发送最后一次ACK报文。

为什么要四次挥手?
TCP是全双工的通信机制,每个方向必须单独进行关闭。

TCP传输连接关闭的原则如下:

当一端完成它的数据发送任务后就可以发送一个FIN字段置1的数据段来终止这个方向的数据发送;当另一端收到这个FIN数据段后,必须通知它的应用层 对端已经终止了那个方向的数据传送。

为什么不能用三次握手中捎带应答机制减少一次握手?

这点到是很迷惑人,但是掌握了TCP传输的一些细节就会发现并不难。

TCP是全双工通信的,S收到断开链接请求后只是表示C端不会传输数据到S端了,但是并不表示S端不传输数据到C端。

如果采用捎带应答,S端将无法把剩余的数据传输到C端。

为何最后一次ACK之后需要等待2MSL的时间?
网络是不可靠的,TCP是可靠协议,必须保证最后一次报文送达之后才能断开链接,否则会再次收到S端的FIN报文信息。

而等待2MSL时间就是为了保证最后最后一次报文丢失时还能重新发送。

为何是2MSL的时间?
2MSL是报文一个往返的最长时间,假设小于这个时间会发生,ACK丢了,但是还没接收到对方重传的FIN我方就重新发送了ACK。

如果已经建立了连接,但是客户端突然出现故障了怎么办?
这个不难TCP自己做了保证,TCP默认有个定时器,每次收到客户端的请求后会把定时器设置好,通常设置两小时,超过两小时还没收到数据。

服务端会发送一个探测报文,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
 

通俗的话来说就是

三次挥手:

A:你瞅啥

B: 瞅你咋地

C: 干一架
 

四次挥手:

A:我要离开这里了

B:你要离开这里了?

B: 你真的要离开这里了?

A:我真的离开这里了。

UDP:好比发短信,不需要对方的回应,我发了即可,至于你能不能收到短信,这不是我用考虑的

  • 不连接,不稳定
  • 客户端,服务端:没有明确的界限【我可以发信息给你(那么你就是服务端),你也可以发信息给我(那么我就是服务端)】
  • 不管你是否准备好接收消息的准备,我都可以发给你、
  • 导弹
  • DDOS:洪水攻击!(饱和攻击)

七、常见的通信协议

1、 Internet层协议

负责数据的传输,在不同网络和系统间寻找路由,分段和重组数据报文,另外还有设备寻址。些层包括如下协议:

IP(Internet Protocol):Internet协议,负责TCP/IP主机间提供数据报服务,进行数据封装并产生协议头,TCP与UDP协议的基础。

ICMP(Internet Control Message Protocol):Internet控制报文协议。ICMP协议其实是IP协议的的附属协议,IP协议用它来与其它主机或路由器交换错误报文和其它的一些网络情况,在ICMP包中携带了控制信息和故障恢复信息。

ARP(Address Resolution Protocol)协议:地址解析协议。

RARP(Reverse Address Resolution Protocol):逆向地址解析协议。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值