一、传输控制协议(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_xxxxchar sa_data[14];//14字节,2字节端口号,剩余放IP
};
struct sockaddr_in{short int sin_family;//地址类型AF_xxxxunsigned 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网络编程——网络基础相关推荐

  1. java 编程原理_Java网络编程 -- 网络编程基础原理

    Hello,今天记录下 Java网络编程 --> 网络编程基础原理. 一起学习,一起进步.继续沉淀,慢慢强大.希望这文章对您有帮助.若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,我是杨展 ...

  2. 高等学校计算机科学与技术教材:tcp/ip网络编程技术基础,TCP/IP网络编程技术基础...

    TCP/IP网络编程技术基础 语音 编辑 锁定 讨论 上传视频 <TCP/IP网络编程技术基础>是2012年北京交通大学出版社出版的图书,作者是王雷. 书    名 TCP/IP网络编程技 ...

  3. python六十七课——网络编程(基础知识了解)

    网络编程: 什么是网络编程? 网络:它是一种隐形的媒介:可以将多台计算机使用(将它们连接到一起) 网络编程:将多台计算机之间可以相互通信了(做数据交互) 一旦涉及到网络编程,划分为两个方向存在,一方我 ...

  4. python网络编程知识_python六十七课——网络编程(基础知识了解)

    网络编程: 什么是网络编程? 网络:它是一种隐形的媒介:可以将多台计算机使用(将它们连接到一起) 网络编程:将多台计算机之间可以相互通信了(做数据交互) 一旦涉及到网络编程,划分为两个方向存在,一方我 ...

  5. 网络游戏《丛林战争》开发与学习之(一):网络编程的基础知识

    <丛林战争>是一款完整的网络游戏案例,运用U3D开发客户端,Socket开发服务端,其中涉及到了网络编程.数据库和Unity的功能实现,之前通过U3D开发了一个单机游戏<黑暗之光&g ...

  6. Java网络编程(网络基础(IP端口号网络通信协议)、TCP编程、UDP编程和URL编程原理以及常用方法的实例)

    网络编程 网络基础概述 计算机网络:   把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信息.共享硬件.软件.数据信息等 ...

  7. 深入分析websocket协议,从3个方面设计网络应用层协议丨网络编程|网络IO|epoll|socket|网络协议丨c/c++linux服务器开发

    深入分析websocket协议,从3个方面设计网络应用层协议 视频讲解如下: 深入分析websocket协议,从3个方面设计网络应用层协议丨网络编程|网络IO|epoll|socket|网络协议丨c/ ...

  8. epoll原理剖析以及reactor模型应用丨网络编程|网络IO|select|poll|socket|reactor多核实现丨c/c++linux服务器开发

    epoll原理剖析以及reactor模型应用 视频讲解如下,点击观看: epoll原理剖析以及reactor模型应用丨网络编程|网络IO|select|poll|socket|reactor多核实现丨 ...

  9. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块-TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  10. 关于HTTP协议、万维网文档以及网络编程的基础梳理

    常用协议 IP协议:是一个分组交换,不保证可靠传输. TCP协议:传输控制协议,面向连接.可靠传输.双向通信. TCP协议是建立在IP协议之上的,(对应TCP/IP模型)IP协议只负责发数据包,不保证 ...

最新文章

  1. Bitcoin ABC发布11月BCH升级要点,快看做了哪些改变?
  2. Linux varnish代理服务器安装以及健康检查
  3. hnu2021小学期程序设计 棋盘
  4. Lintcode: Fast Power
  5. key没有引号的字符串如何转json变为字典格式
  6. apache 的batik生成svg文件和通过swing界面查看效果
  7. 你想要的宏基因组-微生物组知识全在这(2020.03)
  8. UDP传输 TCP传输
  9. 麦咖啡将投资25亿在中国内地布局超过4000家;星巴克中国咖啡创新产业园正式动工 | 美通企业日报...
  10. java如何逆向工程_总结一下java如何进行逆向工程
  11. linux合并ts文件吗,Linux 下使用 ffmpeg 大批量合并 ts 文件, mp4切割文件为m3u8
  12. Win11 右键菜单风格修改为Win10模式
  13. 【读书分享】《解忧杂货店》东野圭吾
  14. 什么是Python中的Pip?
  15. (Emitted value instead of an instance of Error) postcss-viewport-units:
  16. vue 和 ssr+nuxt.js 配置环境变量以及pm2进行服务部署
  17. netty初使用——实现http及https代理服务器
  18. 转行做程序员,你后悔了吗
  19. ioctl函数详细说明(网络)
  20. vue-draggable-resizable定制化可拖动控件

热门文章

  1. Visio(流程图绘制软件)的免费替代品
  2. 电力电子技术实验仿真(一)
  3. 谁是小米真正的友商——小米中国受让专利来源分析
  4. 软件项目管理系统-人员管理-工时记录一览
  5. eclipse翻译插件,支持最新版eclipse 2022-09
  6. Linux之执行一个可执行文件
  7. 设计模式(2)-抽象工厂模式(Abstract Factory)与生成器模式(Builder)模式
  8. i510400和i59400f哪个好?有什么区别
  9. 斐讯路由器k2p a1刷官改只能刷入k2p_57_v*_*固件无法刷入k2p_mtk_v*_*版本--刷入后无法进入主页面/刷入后无法启动
  10. bt协议详解 DHT篇(上)