时间戳转换器

unix网络编程——网络基础(代码片段)

日期:2022-12-07     来源:新时代城市农民工    作者:新时代城市农民工    浏览:366    java教程

本文目录

1、unix网络编程——网络基础(代码片段)

2、unix网络编程之环境搭建

一、传输控制协议(TCP)

tcp是面向连接的的,他不可以被描述为100%可靠的协议,他提供的是数据的可靠传递或故障的可通知。它保证了数据的可以顺序到达、不重复、不丢包。tcp重要的是三次握手和四次挥手做了什么,每次响应和发送都代表了什么。基本的TCP编程模板如下图:

 

1.1 三次握手阶段

SYN:表同步。

服务器端:执行socket创建监听套接字,使用bind函数来绑定存有端口与IP地址的结构体到socket,执行listen函数使服务端主动连接的socket转化为被动的socket,使这个socket可以等待其他socket的连接请求,再利用accpt函数从连接队列中取出连接请求,这里并不是建立了连接,如果连接队列为空的话服务端进入睡眠,如果执行成功的话返回一个非零的描述符用作后续信息传输的端口(已连接套接字)。

客户端:执行socket创建套接字,使用connect函数连接服务端,这里是主动打开。

三次握手的过程:

1、服务器执行了accpt后进入等待客户端接入的状态,此时是被动打开,而客户端调用connect后主动连接服务器,执行connect后进入阻塞状态(SYN_SENT),并且发送SYN包。

2、服务端收到客户端发送的SYN包后进入SYN_RECV状态并且回应客户端的SYN包,回应的是一个ACK包,他就是客户端SYN包加一,且发送一个自己的SYN包。

3、客户端接受到服务器的响应和服务器发送的SYN包进入数据传输状态(ESTABLISH),发送ACK响应包,内容就是服务器发送的SYN包加一。

4、服务器再接收到这个ACK包后也进入数据传输状态(ESTABLISH)。此时accpt返回一个已连接套接字,就可以开始通讯了。

1.2 数据传输阶段

1.客户端使用write来进行数据请求。

2.服务器使用read得到客户端的请求,再使用write返回客户端需要的数据和请求ACK包。

3.客户端使用read读取服务端返回的数据并且给服务器发送一个应答ACK包。

注意点:有序列号所以不会重复发送,也不会乱序,更不会导致漏发。

具有流量控制,TCP总是告知对端他能够接受到多少字节的数据,不会导致接受缓冲区溢出。

1.3 四次挥手阶段

1.客户端调用close函数主动关闭,进入FIN_WAIT_1阶段并发送FIN包。

2.服务端接受FIN包后进入CLOSE_WAIT状态,并返回一个ACK包(FIN+1)。

3.客户端接受到ACK包后进入FIN_WAIT_2状态。

4.服务端调用close函数进入LAST_ACK状态并发送一个FIN包。

5.客户端接收到FIN包后进入TIME_WAIT状态,并返回ACK包。

6.服务端接收到ACK后进入CLOSED状态,关闭连接。

整个过程如下图所示:

二、TIME_WAIT状态

TIME_WAIT状态是客户端发送ACK包后的状态,此时他不会直接关闭,因为他发送的ACK包有可能在传输的过程中丢掉了,并不会被服务端所接受到,服务端有可能重新发送FIN包,如果客户端直接关闭会导致服务端一直反复发送FIN包等待结束。所以需要有TIME_WAIT这一状态,这个状态持续的时间为2MSL(MSL:任何IP包在intel网中存活的最长时间)。

所以TIME_WAIT的存在可以使TCP执行完整的关闭,允许老的重复的分节在网络中消逝。

三、常用结构体

struct sockaddr
	unsigned short sa_family;//地址类型AF_xxxx
	char sa_data[14];//14字节,2字节端口号,剩余放IP
;
struct sockaddr_in
	short int sin_family;//地址类型AF_xxxx
	unsigned short int sin_port;//2字节端口号
	struct in_addr sin_addr;//存IP地址的结构体
	unsigned char sin_zero[8];//占位,保持与sockaddr结构体占一样内存大小
;
struct in_addr
	unsigned long s_addr;//4字节存放IP地址
;

sockaddr_in比sockaddr结构体好就好在IP和端口分开存储。 

四、recv与send的本质

应用层函数recv、send与内核中套接字的真正读取数据,TCP协议层是运行在内核中的,二通信是网卡直接通讯,只要对方send,线路上就有数据,那么协议就会从网卡读取数据进入内核的socket缓冲区中,recv只是从socket内核中把数据拷贝到指定的缓冲区buf中,对协议毫无影响。

socket默认是全缓冲,如果没有setsocketopt的话,只有当socket内核缓冲区中的数据满了才会发送,通过网卡发送。send其实就是将应用层数据拷贝到socket的缓冲区而已,并不代表真正的数据发送。

五、主机与网络字节序(大小端问题)

主机字节序:小端存储,数据的高位存放在终止地址,数据的低位存放在起始地址。

网络字节序:大端存储,数据的高位存放在起始地址,数据的低位存放在终止地址。

在网络的传输中需要利用两种字节序的转换函数来进行转换,这些函数可以自己找找看。我们也可以写个函数来判断系统是大端还是小端,代码如下:

int main(int arv,char** argv)

    union
            short s;
            char c[sizeof(short)]
          un;
    un.s=0x0102;
    printf("%s:",CPU_OS);
    if(sizeof(short)==2)
    
        if(un.c[0]==1&&un.c[1]==2)
        
            printf("big-endian\\n");
        else printf("little-endian\\n");
     
    exit(0);   

 

unix网络编程之环境搭建

相关文章

python网络编程(代码片段)

{网络编程#notes要点网络编程客户端/服务器架构客户端/服务器网络编程套接字是计算机网络数据结构。在任何类型的通信开始之前,网络应用程序必须创建套接字。可以将它们比作电话插孔,没有它将无法进行通信。进程间通信(...}

《unix网络编程》14:高级i/o函数

{高级I/O函数★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★本文信息本文信息防爬虫替换信息作者网站LYMTICShttps://lymtics.top作者LYMT}

《unix网络编程》06:io复用之select/poll

{IO复用之select/poll系列文章导航:《Unix网络编程》笔记概述进程需要一种预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件准备就绪,他就通知进程。这个能力被称为I/O复用。典型应用场景有:客户处理多个...}

网络编程-socket介绍(代码片段)

{Socket介绍什么是socket?(5分钟)Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部...}

unix网络编程——进程间通信

{   进程间通信,InterprocessCommunication,IPC。主要有以下四种不同的IPC形式:         A.消息传递(管道、FIFO和消息队列);         B.同步(互斥量、条件变量、读写锁、文件和记录锁、信号...}

UNIX/MacOS 上静态文件的“临时网络服务器”?

{】UNIX/MacOS上静态文件的“临时网络服务器”?【英文标题】:"Ad-hocwebserver"forstaticfilesonUNIX/MacOSX?【发布时间】:2011-04-1712:58:57【问题描述】:有没有我可以从命令行调用的小型网络服务器之类的东西,它只是从本地文件...}

python学习笔记-scoket编程基础(代码片段)

{socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】...}

linux配置全面讲解(安装jdkmysqlnginx)(代码片段)

{1Linux概述1.1Linux介绍Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux...}

软件开发知识体系

{...络计算机网络自顶向下方法图解HTTPTCP/IP详解卷1:协议UNIX网络编程Linux多线程服务端编程面向对象HeadFirst设计}

linux系统下基础命令介绍

{...PU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux操作系统诞生于1991年10月5日(这是第一次正式向...}

Copyright ©2021 时间戳转换器 小常识 114pp | 陕ICP备18005036号