一.什么是套接字
套接字(socket)是计算机之前数据传输的工具,是有计算机系统提供的一个组件,是网络数据传输的软件设备。
二.TCP/IP协议
TCP/IP协议栈共分为4层(OSI规范分7层),tcp、udp就是基于socket的一种协议
三.套接字的分类
1.流式套接字(TCP)
它提供了一种可靠的、面向连接的双向通讯方式。适用于传输数据量大的场景。
TCP的具有以下三项特征:
传输过程中数据不会丢失,面向连接的套接字会根据接收端的状态传输数据,如果传输出错还会提供重传服务
按序传输数据,发送请求的时候会每个数据包分配一个序列号,并且在一个特定的时间内等待接收主机对分配的这个序列号进行确认,如果在特定的时间内没有收到确认,就会重新发送
传输的数据不存在边界,计算机之间建立了TCP连接以后,就好比创建了一条数据管道,发送多少数据,就会接收多少数据。但是这样会引起数据粘包的问题。
TCP协议报文格式:
2.数据报套接字(UDP)
它是一种不可靠的、面向消息的通讯方式,以数据包的方式发送,通讯效率高,适用于传输数据量小的场景。
UDP具有以下四项特征:
强调快速传输,不要求顺序传输,udp没有和远程计算机建立连接,也不关系数据重传,因此传输效率比较快。
传输的数据可能丢失或损毁,面向消息的套接字没有确认、重传机制,固不能保证数据的丢失。
传输的数据有边界,因为传输的是一个数据包,数据包固然是有大小的。
限制每次传输的数据大小,发送方在发送数据时会指定数据包的大小。
UDP报文格式:
四.地址族
IP
说到socket就不得不说地址族,我们都知道服务器之间连接,必须通过IP地址这个桥梁,接下来就简单说一下网络IP。目前网络IP分为两类,一类是IPV4、一类是IPV6。
IPV4就是4个字节的地址族。IPV6就是16个字节的地址族,IPV6是解决IP地址耗尽的问题而推出的。下面介绍一下IPV4的IP。
根据这个规则,可以根据第一个字节判断网络地址占用的字节数,因为我们会根据IP地址的边界来区分网络地址。
A类地址的首字节范围:0~127
B类地址的首字节范围:128~191
C类地址的首字节范围:192~223
网络ID就是我们通常说的网段,网络ID相同的计算机不需要通过路由器连接就能够直接通信。主机ID就是这个网段中具体的机器IP。
当为一台计算机分配IP地址后,该计算机的IP地址哪部份表示网络ID,哪部份表示主机ID,并不由IP地址所属的类来确定,而是由子网掩码确定。
子网掩码的格式是以连续的255后面跟连续的0表示,其中连续的255这部份表示网络ID;连续0部份表示主机ID。比如,子网掩码255.255.0.0和255.255.255.0。
根据子网掩码的格式可以发现,子网掩码有0.0.0.0、255.0.0.0、255.255.0.0、255.255.255.0和255.255.255.255共五种。采用这种格式的子网掩码每个网络中主机的数目相差
至少为256倍,不利于灵活根据企业需要分配IP地址。比如,一个企业有2000台计算机,用户要么为其分配子网掩为255.255.0.0,那么该网络可包含65534台计算机,
将造成63534个IP地址的浪费;要么用户为其分配8个255.255.255.0网络,那么必须用路由器连接这个8个网络,造成网络管理和维护的负担。
例:IP地址:192.168.23.35 子网掩码:255.255.0.0
网络ID:192.168.0.0 主机ID:23.35
端口
IP用于区分计算机,只要有IP地址就能向服务器传输数据,但是无法精确到哪一个应用程序,这里就必须通过端口区分是哪一个应用程序了。
端口就是区分操作系统中不同的套接字,端口有16位构成,端口可用范围:0-65535。0-1023是知名端口,比如http 80端口 ftp 21端口等。
TCP和UDP是可以用同一个端口,因为操作系统最终不是根据端口区分的,而是同一个端口的应用程序用的是不是同一种协议,所以是不冲突的。
五.socket通讯逻辑
服务端
socket :创建服务端套接字
bind :给套接字绑定IP、端口号
listen:进入等待连接请求状态,只有服务端调用了此函数,客户端才能进入可发送请求的状态。
accept:等待受理客户端请求,与客户端建立连接。
客户端
socket:创建客户端套接字
connect:向服务端发起连接请求,建立通讯管道
三次握手
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
原文地址:https://www.cnblogs.com/aaronzheng/p/11474079.html