socket网络编程

简介: (*´▽`)ノノ在讲网络编程之前,首先要了解下网络的架构。我们都知道TCP/IP网络模型共有7层:第一层网络接口层:将osi的物理层和数据链路层合二为一。物理层 是网络的传输介质层,处于网络的最低层,是网络的载体。

- 网络编程


QQ_20180808145955


在讲网络编程之前,首先要了解下网络的架构。

我们都知道TCP/IP网络模型共有7层:
第一层网络接口层:将osi的物理层和数据链路层合二为一。物理层 是网络的传输介质层,处于网络的最低层,是网络的载体。利用物理介质对上次网络提供物理连接。常用的设备哟网卡、集线器、中继器、调制解调器、网线等。数据链路层:在这层,将数据进行分帧,并进行流的控制,屏蔽物理层,为上层(网络层)提供数据链路的连接。本层进行硬件寻址(MAC地址,ARP协议)。
第三层网络层:本层通过寻址来建立两个节点之间的连接,为上层(运输层)提供链路传输功能。负责建立和维护连接,拥塞控制等。(IP协议)
第四层传输层:面向连接和无连接的传输。(tcp,udp,端口)
第五层应用层:不多说

两个在不同网络的主机程序进程进行通信的流程为:
S(Server):传输层打开一个端口,绑定socket套接字,进行监听端口,等待外部的连接。
如果外部有连接,则Accept,

A(client):先建立一个socket套接字,连接到服务器

- 设置TIME_WAIT的原因

可靠地实现TCP全双工连接的终止
TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。
因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态
允许老的重复分节在网络中消逝
TCP分节可能由于路由器异常而“迷途“,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。

QQ_20180808145824

- 并发服务器

QQ_20180808145936

pid_t pid;
int listenfd,connfd;
listenfd = socket(...);
bind(listenfd...);
listen(listenfd,LISTENQ);
for( ; ; ){
    connfd = accept(listenfd,...);
    if( (pid = Fork()) == 0){
        close(listenfd);   // child closes listening socket
        doit(connfd);     // process the request
        close(connfd);    // done with this client
        exit(0);
    }
    close(connfd);   // parent closes connected socket
}

针对一个TCP套接字调用close会导致发送一个FIN,随后是正常的TCP连接终止序列。但是在上面福进程首先调用close(connfd),会什么没有终止连接呢。
我们必须知道每个文件或者套接字都有一个引用计数。引用计数在文件表象中维护着。在创建listenfd的时候,引用计数为1,当复制到子进程的时候,引用计数为2,这么一来,当父进程关闭connfd的时候,他只是把相应的引用计数减为1.该套接字的真正清理应该等引用计数变为0才会发生。

相关文章
|
7月前
|
网络协议 网络性能优化 开发者
Python网络编程基础(Socket编程)UDP Socket编程
【4月更文挑战第8天】Python网络编程中,UDP与TCP协议各有特点。TCP提供可靠连接,确保数据顺序与完整性,适合文件传输等;UDP则无连接,速度快,常用于实时音视频,牺牲了数据可靠性。Python的socket库支持两者,开发者可根据需求选择。
|
7月前
|
存储 Python
Python网络编程基础(Socket编程)UDP客户端编程
【4月更文挑战第9天】在UDP通信中,客户端负责发送数据到服务器,并接收来自服务器的响应。与服务器不同,客户端通常不需要绑定到特定的地址和端口,因为它可以临时使用任何可用的端口来发送数据。下面,我们将详细讲解UDP客户端编程的基本步骤。
|
7月前
|
API
网络编程与select/poll/epoll服务器的实现(1)
什么是网络编程?     本部分主要是介绍socket网络编程的基本API——并展示一个服务器与客户端连接的具体流程是如何的实现一个一对一的网络服务器程序
71 0
|
4月前
|
网络协议 Java
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
这篇文章全面讲解了基于Socket的TCP网络编程,包括Socket基本概念、TCP编程步骤、客户端和服务端的通信过程,并通过具体代码示例展示了客户端与服务端之间的数据通信。同时,还提供了多个案例分析,如客户端发送信息给服务端、客户端发送文件给服务端以及服务端保存文件并返回确认信息给客户端的场景。
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
|
6月前
|
监控 算法 Java
socket网络编程详解
socket网络编程详解
|
7月前
|
Python
Python网络编程基础(Socket编程)UDP服务器编程
【4月更文挑战第8天】Python UDP服务器编程使用socket库创建UDP套接字,绑定到特定地址(如localhost:8000),通过`recvfrom`接收客户端数据报,显示数据长度、地址和内容。无连接的UDP协议使得服务器无法主动发送数据,通常需应用层实现请求-响应机制。当完成时,用`close`关闭套接字。
|
7月前
|
缓存 Linux API
网络编程与select/poll/epoll服务器的实现(2)
I/O多路复用——select Q:什么是IO多路复? A:多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是,不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监视文件。 主要使用的方法有三种:
90 0
|
7月前
|
网络协议 Linux PHP
40001.C++socket网络编程
40001.C++socket网络编程
60 0
基于UTP的Socket编程(基础)
基于UTP的Socket编程(基础)
119 0
|
网络协议 API 数据处理
Socket网络编程入门
Socket网络编程入门
232 0
Socket网络编程入门