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

网络编程

ICMP协议:是TCP/IP的一个子协议。是控制报文协议,用在IP主机、路由器之间传递控制消息;(控制消息是指1网络通不通、主机是否可达、路由是否可用等网络本身的消息)

HTTP协议:超文本传输协议

SSH协议(端口22):网络安全协议,专为远程登录会话和其它网络服务提供安全性的协议;

FTP协议:文件传输协议;

ARP协议:介于数据链路层和网络层之间,ARP包需要包裹在一个帧中。只用于IPv4

                   工作方式:主机发出一个ARP包,该ARP包中包含有自己的IP地址和MAC地址。通过ARP包,主机以广播形式询问局域网上所有的主机和路由:我是IP地址****,我的MAC地址是***,有人知道199.165.146.4的MAC地址吗?拥有该IP地址的主机会回复发出请求的主机:哦,我知道,这个IP地址属于我的一个NIC(网卡),它的MAC地址是*******。由于发送ARP请求的主机采用的是广播形式,并附带有自己的IP地址和MAC地址,其它的主机和路由会同时检查自己的ARP cache,如果不符合,则更新自己的ARP cache;

这样,经过几次ARP请求之后,ARP cache会达到稳定。如果局域网上设备发生变动,ARP重复上面过程。

a.MAC地址:以太网规定,连入网络的所有设备,都必须具有“网卡”接口。数据包必须是从一块网卡,传送到另一块网卡,网卡的地址就是数据包的发送地址和接受地址,也叫MAC地址;每块网卡出厂的时候,都有全世界独一无二的MAC地址,长度是48位的二进制,通常用12个十六进制数表示;前6个十二进制是厂商编号,后6个是该厂商的网卡流水号;

b.IP地址:IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位;(Internet物理地址和IP地址转换采用ARP协议【地址解析协议】);(引入一套新地址,使我们能够区分哪些计算机属于同一个子网,这套机制就叫做“IP地址”);

DNS解析(网域名称系统):端口号53,是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网;

(2)tcp协议(在传输层)

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

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

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

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

 

 

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

防止已经失效的链接请求报文段,突然有传到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结构体的地址

*“namelen”sockaddr结构体的字节长度

   B. connect()函数

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

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

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

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

*“namelen”sockaddr结构体的字节长度

C.listen()函数

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

详情:int listen(int s,int backlog);

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

内核会为一个监听套接字维护两个队列,当有TCP请求到来时,即3次握手中的syn分节发送来时,会在未完成队列中增加一项,3次握手完成时,未完成队列中的项就移动到已完成队列里,accept()函数会从已连接队列里取走已完成连接.

这个backlog参数就是控制我们的已连接队列里等待accept()取走的连接的最大数目的.注意一点,backlog与这个已排队连接的最大数目未必是完全相等的,不同的系统的实现可能不同.比如backlog=1,系统允许的实际一排队数目可能为2;

 

D.accept()函数

功能:接纳客户的请求;

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

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

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

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

E、kill进程时对socket的关闭处理

Linux照顾到了一种特殊情况,即杀死进程的情况,在系统kill进程的时候,会直接调用连接的close函数单方面关闭一个方向的连接,然后并不会等待对端关闭另一个方向的连接进程即退出。现在的问题是,TCP规范和UNIX进程的文件描述符规范直接冲突!进程关闭了,套接字就要关闭,但是TCP是全双工的,你不能保证对端也在同一个时刻同意并且实施关闭动作,既然连接不能关闭,作为文件描述符,进程就不会关闭得彻底!所以,Linux使用了一种“子状态”的机制,即在进程退出的时候,单方面发送FIN,然后不等后续的关闭序列即将连接拷贝到一个占用资源更少的TW套接字,状态直接转入TIMW_WAIT,此时记录一个子状态FIN_WAIT_2,接下来的套接字就和原来的属于进程描述符的连接没有关系了。等到新的连接到来的时候,直接匹配到这个主状态为TW,子状态为FIN_WAIT_2的TW连接上,它负责处理FIN,FIN ACK等数据。

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:套接字接收缓冲区当中的数据字节数大于等于套接字接收缓冲区中设置的最最小值。(对于TCP和UDP来说默认值为1)

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

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)http和https协议(网络协议)的区别:

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

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

C.  http和https使用的是完全不同的连接方式,用的端口也不一样(http:80;https:443);

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

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

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值