Linux基础总结----网络部分

网络编程

(1)OSI七层模型和TCP/IP五层模型

A. OSI七层模型:

应用层---------------------为应用程序提供服务

表示层---------------------数据格式转化,数据加密

会话层---------------------建立,管理和维护回话

传输层---------------------建立,管理和维护端到端的连接

网络层---------------------IP选址及路由选择

数据链路层---------------提供介质访问和链路管理

物理层---------------------以二进制数据的形式在物理媒介上传输数据

B.TCP/IP五层模型:将上述应用层,表示层,会话层统称为了应用层。

2tcp协议(在传输层)

*协议:通信的计算机双方必须遵守的一组约定

*端口:整型值,应用程序的代号

I.详解:是一种端到端的面向连接的传输控制协议,为应用提供靠的数据传输服务

II.TCP连接建立(三次握手):

 

 

三次握手不能改为两次的原因:

防止已经失效的链接请求报文段,突然有传到B而产生错误。

Eg: 现在假定出现这样一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间滞留了,以致延误到连接释放以后某个时间才到达B,本来这是一个早已失效的报文,但是B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立好了。由于现在A并没有发出连接请求,因此不会理睬B的确认,也不会向B发送数据。但是B确以为间的运输连接已经建立了,并一直等待A发来的数据。B的许多资源就这样浪费了。采用三次握手的办法可以防止这样的现象发生。

 

 

   

TCP断开(四次挥手)

  为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

        这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

TIME-WAIT状态是什么?为什么会有TIME-WAIT状态?如何避免TIME-WAIT状态占用的资源?

TIME-WAIT状态:客户端连接在收到服务器的结束报文段之后,并没有直接进入CLOSE状态,而是转移到TIME-WAIT状态。在这个状态,客户端连接要等待2MSL才会进入关闭状态。

TIME-WAIT状态存在的原因:

1)可靠的终止TCP连接

2)保证让迟来的TCP报文段有足够的时间识别并丢弃(当一个TCP连接处于TIME-WAIT状态时,我们将无法立即使用该连接占用着的端口号建立一个新连接)

避免TIME-WAIT状态:可以通过socket选项SD_REUSEADDR来强制进程立即使用处于TIME-WAIT状态的连接占用的端口。

 

III.TCP协议滑动窗口协议的功能

1. 实现tcp协议的可靠传输;

2. tcp流量控制.tcp没来的及对前面的数据做处理确认时,A的可用发送窗口将变小,甚至为零。这样就减少了发送端的流量输出,反之则增大输出,这种方式能够实现发送端与接收端的协调,即实现了流量控制。

IV:拥塞控制

A.慢启动

由于tcp三次握手成功后,会向网络中发送大量的数据包,这样很容易出现拥塞。因此新建立的连接不能一开始就发送大量的数据包,而只能根据网络情况逐步增加每次发送的数据量。

B.快速重传

当丢包时,接收端重复发送丢包前的ACK,发送端每发送一个包过来,接收端就发相同的ACK过去,这个ACK是对丢包之前的确认。当接收端收到三个相同的ACK,就知道他发生丢包了,根据ACK序号就能重发丢的包。

C.快速恢复

(2)TCP协议与UDP协议的区别

TCP可靠的,有连接的,流式服务

UDP:无连接,不可靠,数据报

(3)socket套接字

A. bind()函数

功能:通过给一个未命名的套接口分配一个本地的名字来为套接口建立本地捆绑(主机地址/端口号)。

使用:connect()或者listen()调用前使用。

详情:int bind(int s,const struct sockaddr *name,namelen);

*s”是socket()创建的文件描述符;

* “name”指向要连接套接字的sockaddr结构体的地址

*namelensockaddr结构体的字节长度

   B. connect()函数

功能:用于建立与指定socket的连接,发起三次握手

详情:int connect(int s,const struct sockaddr *name,namelen);

*s”标识一个未连接的socket;

* “name”指向要连接套接字的sockaddr结构体的地址

*namelensockaddr结构体的字节长度

C.listen()函数

功能:其可以使主动连接套口变成被动连接套口,使得一个进程可以接受其他进程的请求,从而成为一个服务器进程。

详情:int listenint s,int backlog);

*s”是socket()创建的文件描述符;

 

D.accept()函数

功能:接纳客户的请求;

详情:int accept(int s, struct sockaddr *addr,addrlen);

*s”套接字描述符,该套接口在listen后监听连接;

*addr”(可选)指针,指向一个缓冲区,接收连接实体的地址;

*addrlen”(可选)指针,指向存有addr地址长度的整型数;

2. I/O复用

(1)select,epoll,poll函数详解

A. select()函数

I.原型:

int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timecal* timeout);

*nfds指定被监听的文件描述符的总数;

*readfd,writefd,exceptfds分别指向可读可写和异常事件对应的文件描述符的集合。

*timeout设置select函数的超时时间。

II.使用

应用程序在调用select函数时,通过readfd,writefd,

exceptfds三个参数传入自己感兴趣的文件描述符。Select函数调用返回时,内核将修改他们来通知应用程序那些文件描述符已经就绪。fd_set结构体只包含一个整形数组,数组每一位包含一个文件描述符。

III.描述符就绪条件

a. 满足下列条件之一,套接字准备好读

a1:套接字接收缓冲区当中的数据字节数大于等于套接字接收缓冲区中设置的最最小值。(对于TCPUDP来说默认值为1

a2:改连接的读半部关闭(也就是接收了FINTCP;

a3:该套接字是一个监听套接字,且已完成的连接数不为0;对于这样的套接字,accept通常不会阻塞;

a4:其上有一个套接字错误处理;

b. 满足下列任意一个条件时,套接字准备好写

b1:该套接字发送缓冲区中可用空间的大小大于等于套接字发送缓冲区当中设置的最小值时,并且或者该套接字已经连接,或者套接字不需要连接(UDP;

b2:该连接的写半部关闭;

b3:使用非阻塞式的connect的套接字已建立连接,或者connect已经以失败告终;

b4:其上有一个套接字待错误处理;

IV:缺点

a. 每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;

b. 每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大;(时间复杂度为O(N));

*用户态:执行自己的代码;

*内核态:执行操作系统的代码;

*在执行系统调用,中断服务,或者程序异常时,会从用户态切到内核态;(系统调用:在内核实现;函数:在库中执行,不一定会出现用户态和内核之间的切换);

*调用系统调用后用户态和内核态之间的切换:

 

 

 

 

 

 

c.单个进程能够监视的文件描述符存在最大的限制

B.poll()函数

I.函数原型:

int poll(struct pollfd *fds,nfds_t nfds,int timeout);

II.函数使用

select函数一样,它也是在指定时间内轮询一定量的文件描述符,以测试其中是否有已经就绪的。

III.缺点

a. 包含大量的文件描述符的数组被整体复制于用户态与内核态之间,而无论文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。(时间复杂度为O(N);

IV.优点

没有最大文件描述符数量的限制(不过随着文件描述符数量的增加,它的性能也会下降)。

C.epoll()函数

I.epoll函数的创建:int epoll_create(int size);

*size只是给内核一个提示,告诉它需要多大的事件表;

II.epoll内核事件表的操作:

int epoll_ctl(int epdf,int op,int fd,struct epoll_event*

event);

*fd为要操作的文件描述符;

*op指定操作类型(往事件表中注册,修改,删除fd上的注册事件);

*event 指定事件;

III.epoll系列系统调用的主要接口:

int epoll_wait(int epfd,struct epoll_event *events

,int maxevents,int timeout);

此函数如果检测到事件,就将所有就绪事件从内核事件表中(由epfd中的参数指定)复制到它的第二个参数events指定的数组中,这个数组只输出epoll_wait检测出的就绪事件。

*LT模式:在数据到达后,无论程序是没有接收,还是接收了,但没有接收完,下一轮epoll_wait仍然会提醒应用程序该描述符上有数据,直到数据被接收完;

*ET模式:在数据到达后,无论程序是没有接收,还是接收了,但没有接收完,都只提醒一次,下一轮不在提醒应用程序该描述符上有数据。所以,要求程序在收到提醒时必须将数据接收完,否则将会出现丢掉数据的可能。

(2)三个函数的区别

 

 

3. 应用层协议

(1)http协议(端口号为80

A. 特点:

A1:支持客户/服务器模式;

A2:简单快速。客户向服务器请求服务时,只需传送请求方法和路径。

*常用的请求方法有:GET:请求获得资源

POST:请求附加新的数据

PUT:请求服务器存储一个资源

A3:灵活。允许传输任意类型的数据对象。

A4:无连接。其含义是限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户的回应后,断开连接。   A5:无状态,即对处理事务没有记忆力;

B.http协议的响应

响应由三个部分组成:状态行,消息报头,响应正文

B1:常用的应答状态码:

1XX:指示信息---表示请求已接收,继续处理;

2XX:成功------表示请求已经被成功接收,理解,接受

3XX:重定向-----要完成请求必须进行更近一步的操作

4XX:客户端错误----请求有语法错误或者请求无法实现

*400----客户端请求有语法错误,不能被服务器理解;

*401-----请求未经授权

*403-----服务器收到请求,但拒绝提供服务

*404-----请求资源不存在

5XX:服务器端错误----服务器未能实现合法的请求

*500---服务器发生不可预期的错误

*503----服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

(2)httphttps协议(网络协议)的区别:

A.  https协议需要申请ca证书,一般免费证书很少,需要交费;

B.  http是超文本传输协议,信息是明文传输,https则是具有安全性的SSL加密传输协议;

C.  httphttps使用的是完全不同的连接方式,用的端口也不一样(http80https443);

D.  http协议的连接很简单,是无状态的;

E.  https协议是由SSL+HTTP协议构成的可进行加密传输,身份认证的网络协议。要比http协议安全;

 

 

猜你喜欢

转载自blog.csdn.net/m0_37962600/article/details/79812077