后台开发 - 网络

TCP协议

三次连接,四次释放

  1. 两次握手会产生错误(防止已失效的连接请求又传送到服务器端,因而产生错误)。

    假如A发了两次连接请求a,b(因为服务器回应超时),第二次请求b先到达,然后与服务器建立连接,但是当a到达的时候,服务器以为客户端又发出一条新连接,所以会发送确认,并在服务器上为此次新连接配置资源,但是客户端已经建立连接,并没有发起新的连接,所以会丢掉服务器这次发来的确认,而此时服务器已经配置了资源,所以造成了服务器资源的浪费。

  2. 因为tcp通信是全双工状态,所以有两个方向,如果要释放,就要将释放两条线路上的,所以是四次。

    1、A发送FIN=1,seq=u,则此时A就不可以发送数据了。
    2、主机B收到A发送的FIN,表示收到了,就会发送ACK=1,seq=v,ack=u+1回复,A->B链路释 放掉了。
    3、但这个时候B可能还在发送数据,没有想要关闭数据口的意思,所以等到B数据发送完了,才会发送FIN=1,ACK=1,seq=w,ack=u+1给主机A,此时B就不可以发送数据了。
    4、A收到B发来的FIN,知道B的数据也发送完了,回复ACK=1,seq=u+1,ack=w+1, A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。

  3. MSL(最长报文段寿命Maximum Segment Lifetime),建议2分钟,所以要等近4分钟,如第2点中步骤4,为什么要等待2MSL时间?

    1、保证A发送的最后一个ACK报文段可以到达B,使得B正常关闭。如果不等的话,A发送的ack丢失,则会造成b无法关闭。等待则保证B能正常接收。如果在2MSL时间中,又收到B发送的FIN(超时重传),则A重新发送ACK,并重启定时器。
    2、防止出现”已失效的连接请求报文段”,经过2MSL时间可保证本连接时间内的所有报文段都可以从网络消失。

TCP连接中出现RST的情况

当一端收到RST导致读取socket返回ECONNRESET,此时如果再次调用write发送数据给对端则触发SIGPIPE信号,信号默认终止进程,如果忽略此信号或者从SIGPIPE的信号处理程序返回则write出错返回EPIPE。常见的产生RST的场景如下:

端口未打开

服务器程序端口未打开而客户端来连接,这种情况很常见,特别经常发生服务器程序core dump之后重启之前连续出现RST的情况。

请求超时

在客户端的程序建立了socket之后,用setsockopt的SO_RCVTIMEO选项设置了recv的超时时间为100ms,客户端connect服务端端口时,从发出SYN到服务端,再到接收到服务端的SYN的时间多达110ms。此时,客户端上的程序认为接收SYN超时,所以会给服务端发送RST拒绝进一步发送数据。

提前关闭

TCP是一种可靠的连接,这个可靠有这样一种含义,那就是操作系统接收到的来自TCP连接中的每一个字节,我都会让应用程序接收到。如果应用程序不接收,那么就会给对端发送RST。

client给server发送了5000的字节数,server只接收了4096字节就close了socket,close的时候server就会给client发送RST。

在一个已关闭的socket上收到数据

如果某个socket已经关闭,但依然收到数据也会发送RST。

client第一次发送数据给server,server接收到数据后,立马close套接字,client等待1s后再次给server发送数据,此时server端套接字已经关闭,server会给client发送RST。

epoll、select区别

select

最大并发数限制:使用32个整数的32位,即32*32=1024来标识fd,虽然可修改,但是有以下第二点的瓶颈;
效率低:每次都会线性扫描整个fd_set,集合越大速度越慢;
内核/用户空间内存拷贝问题。

epoll

本身没有最大并发连接的限制,仅受系统中进程能打开的最大文件数目限制;
效率提升:只有活跃的socket才会主动的去调用callback函数;
省去不必要的内存拷贝:epoll通过内核与用户空间mmap同一块内存实现。

拥塞控制、滑动窗口、慢启动等

HTTP协议

http请求

HTTP请求包括三部分:请求行、消息报头、请求正文,协议如下所示:
POST /reg.jsp HTTP/ (CRLF)
Accept:image/gif,image/x-xbit,… (CRLF)
… …
HOST:www.guet.edu.cn (CRLF)
(CRLF) //该CRLF表示消息报头已经结束,在此之前为消息报头
user=jeffrey&pwd=1234 //此行以下为提交的数据

Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行

http响应

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

猜你喜欢

转载自blog.csdn.net/shangshengshi/article/details/78754503