目录
一、port
二、网络数据的五元组信息(源IP,目的IP,源端口,目的端口,协议)
三、网络字节序
3.2 主机字节序与网络字节序的相互转换
四、TCP和UDP协议特点和区别
4.1、UDP:
4.2、TCP
五、UDP_socket 编程
5.1、编程流程
5.2、接口
5.2.2创建套接字的接口
5.2.3绑定接口
5.2.4发送消息
六、代码实现
1、服务端代码
2、客服端代码:
3、排查问题
4、关于udp的几个疑问
本质 : 端口号是一共2字节16位整数,范围是[0,65535];
ssh://zhangyunfei:***********@124.222.51.214:22
作用:端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理,
注意: 一共端口号只能被一个进程所占用,一个进程可以占用多个端口号(在同一台机器当中)
一些知名端口:
1~1023 范围内的端口已经被一些知名的协议所使用,我们在编写代码的时候不要使用该范围内的数据作为端口号
Oracle----1521
MySQL----3306
源IP: 标识网络数据是从哪台主机发出的
目的IP: 标识数据要去往哪一台主机
源端口: 标识网络数据是从“源IP”对应的这台主机的哪个进程产生的
目的端口:通过目的IP找到目的主机之后,需要利用目的端口找到对应的进程
协议: 标定双方传输数据时使用的协议,一般是UDP/TCP
结论:在网络当中传输的信息,都是包含五元组信息的 !
小端字节序:低位放在低地址
大端字节序:低位放在高地址
网络字节序:规定网络传输数据的时候采用大端字节序进行传输
主机字节序:指的是机器本身的字节序,如果是大端,则主机字节序为大端,如果是小端,则主机字节序为小端
转换的过程如下:
两个接口:
主机字节序转换为网络字节序:
网络字节序转换为主机字节序:
无连接: UDP双方在发送数据之前, 是不需要进行沟通的。 只需要知道对方的ip和端口就好(可能对方进程还没有准备好),就可以发送, (这就好比你给一个人发微信不用关心对方是否在线)
不可靠: 不保证UDP数据是可靠,有序的到达对方
面向数据报: UDP和应用层/网络层递交数据的时候, 都是整条数据进行交付的
面向连接: TCP双方在发送数据之前会先建立连接。 (1.确保对方正常能通信, 2.沟通双方发送后续数据的细节(例如序号 ) )
可靠传输: TCP保证传输的数据是可靠、有序的到达对端的
面向字节流:
1.对于传输的数据没有明显的边界
2.对于接收方而言,可以按照任意的字节进行接收
客户端 --服务端
创建套接字的含义:
1、将进程和网卡进行绑定,进程可以从网络协议栈中接收或者发送数据
绑定地址信息的含义:
1、给进程绑定ip,绑定端口。为了在网络当中标识一台主机和一个进程
这样一来,对于接收方而言,发送数据的人就知道接受方的在哪台机器的哪个进程了;对于发送方而言,能够标识网络数据是从哪台机器的哪个进程发送出去的。
int socket ( int domain, int type, int protocol );
int bind (int sockfd, const struct sockaddr* addr, socklen_t addrlen);
参数:
sockfd-----创建套接字时返回的套接字描述符
addr-----绑定的地址信息(IP + port)
addrlen----绑定的地址信息的长度
疑问 :
5.2.5接收消息&关闭消息
netstat -anp | grep [端口号] , 查看端口的监听情况
1、验证udp的不可靠性:
2、客户端和服务端都启动时,看会是怎么样的
我们可以看到,server并没有收到任何数据,这时候去观察下客户端的调用堆栈,发现已经在sleep了,
说明肯定已经发送了数据,只不过服务端没有收到数据。
1、关注客户端发送数据的时候,给的ip和端口到底对不对
2、关注防火墙
我们这时候进入我们的腾讯云去修改下防火墙的设置
添加udp规则
修改过后,我们再来让程序跑起来试一下:
我们可以看到能够接收到数据了
3、利用本地回环地址“127.0.0.1”
将客户端的地址改为本地回环地址 “ 127.0.0.1 ”,测试当前机器的网络协议栈是否是好着的
4、关闭自己机器的防火墙
进入root用户中将防火墙关闭掉
开启防火墙的命令是start
问题1、为什么不推荐客户端绑定地址信息呢?
首先明确:客户端是可以绑定的
我们先来进行绑定,然后试一下能不能行
我们可以发现,绑定过后确实是能够让程序正常执行的
不推荐的原因:
如果客户端绑定了地址信息,那么在一台机器当中,就不能多开多个客户端,因为一个端口只能被一个进程所绑定
在我们不绑定的时候,就可以多开
问题2、为什么客户端没有绑定地址信息,但在发送数据的时候却有ip和端口呢?
原因:客户端调用的sendto函数会默认给客户端绑定地址信息
问题3、可不可以持续发送消息?
当然可以
问题4、服务端可以给客户端发送消息吗?
肯定可以,但是服务端必须知道客户端ip和端口才能通信
服务端向客户端发信息:
客户端代码增加:
我们来观察一下现象:
可以发现双方在互相发送消息。