网络编程-套接字(socket)

一.什么是套接字

  套接字(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

时间: 2024-08-07 14:08:32

网络编程-套接字(socket)的相关文章

网络编程 套接字socket 及 粘包

网络编程 套接字socket 及 粘包 sockt 初识 五层协议 : 从传输层包括传输层以下 , 都是操作系统帮我们封装的各种head socket套接字充当的就是内置模块的角色 socket 套接字,它存在于传输层与应用层之间的抽象层 避免你学习各层的接口以及协议的使用, socket已经封装好了所有的接口 . 直接使用这些接口或者方法即可 , 使用起来方便,提升开发效率 socket 就是一个模块 , 通过使用学习模块提供的功能 , 建立客户端与服务端的通信 套接字的工作流程(基于TCP和

java 网络编程-套接字Socket图

原文地址:https://blog.51cto.com/14437184/2432469

linux网络编程——套接字(socket)入门

1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_family; /* address族, AF_xxx */ char sa_data[14]; /* 14 bytes的协议地址 */ }; sa_family 一般来说,都是"AFINET". sa_data 包含了一些远程电脑的地址.端口和套接字的数目,它里面的数据是杂溶在一切的. 为了处理struct socka

网络---中断套接字Socket

1 package socketpack_2; 2 import java.awt.BorderLayout; 3 import java.awt.EventQueue; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 import java.io.PrintWrit

Linux 网络编程——套接字的介绍

套接字是一种通信机制(通信的两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信.我们可以用套接字中的相关函数来完成通信过程. 套接字的特性有三个属性确定,它们是:域(domain),类型(type),和协议(protocol). 套接字的域 域指定套接字通信中使用的网络介质.最常见的套接字域是 AF_INET,它是指 Internet 网络,许多 Linux 局域网使用的都是该网络,当然,因特网自身用的也是它. 套接字类型 流套接字(SOCK_STREAM): 流套接字用于提供面向连

UNIX网络编程——套接字选项(心跳检测、绑定地址复用)(转)

/* 设置套接字选项周期性消息检测连通性 心跳包. 心博.主要用于长连接. * 参数:套接字, 1或0开启, 首次间隔时间, 两次间隔时间, 断开次数 */ void setKeepAlive( int iSockfd , int iSockAttrOn, socklen_t iIdleTime , socklen_t iInterval , socklen_t iCount ){ setsockopt( iSockfd , SOL_SOCKET , SO_KEEPALIVE , (const

网络编程套接字,osi七层架构各层协议最全讲解

目录 Socket原理 1.什么是Socket 2.网络中进程如何通信 2.1.本地进程间通信 2.2.网络中进程如何通信 3.Socket怎么通信 4.TCP/IP协议 4.1.概念 4.2.TCP的粘包问题以及数据的无边界性: 4.3.TCP数据报结构: 4.4.连接的建立(三次握手): 4.5.TCP四次握手断开连接 4.6.关于 TIME_WAIT 状态的说明 4.7优雅的断开连接–shutdown() 5.OSI模型 6.Socket常用函数接口及其原理 6.1.使用socket()函

<网络编程>套接字介绍

1.端口:IANA(Internet Assigned Numbers Authority)维护着一个端口号分配状况的清单. 众所周知的端口(0-1023):由IANA分配和控制,可能的话,相同的端口号尽可能分配给TCP,UDP和STCP的同一给定服务 已登记的端口(1024-49151):这些端口不受IANA控制, 动态.私用的端口(49152-65535):临时端口. 2.套接字:一个套接字对是一个定义该连接的两个端点的四元组.{本地IP,本地TCP端口号,外地IP,外地TCP端口号} 套接

Python网络编程—套接字属性

socket套接字属性 [1] sockfd.type 套接字类型 [2] sockfd.family 套接字地址类型 [3] sockfd.getsockname() 获取套接字绑定地址 [4] sockfd.fileno() 获取套接字的文件描述符 [5] sockfd.getpeername() 获取连接套接字客户端地址 [6] sockfd.setsockopt(level,option,value)功能:设置套接字选项参数: level 选项类别 SOL_SOCKEToption 具体