TCP网络编程笔记

1:当调用函数connect时, 发出一个SYN, 若无响应, 等待6秒后再发一个, 若仍无响应, 24秒钟后再发一个, 若总共等了75秒钟之后仍未收到响应,则返回错误.
2:有三个条件返回RST, 1:SYN到达某端口, 但此端口没有正在监听的服务器, 2,TCP想取消一个已有连接,3, TCP接受了一个无法识别,或者不存在的连接上的分节.
3:int listen(int sockfd, int backlog)函数, 其中第二个参数规定了内核为此套接口排队的最大链接个数.
其中已完成连接队列标表示三次握手已经建立(ESTABLISHED), 半连接队列表示正在三次握手中,服务端的状态是SEND_RECV,在这里插入图片描述
在这里插入图片描述
当来自客户的SYN到达时, TCP在未完成连接队列中创建一个新条目, 然后用三路握手的第二个分即服务器SYN+ACK,这个条目保留在未完成队列中, 知道三次握手完成,或者SYN_ACK重传超时(75秒), 如果三次握手完成, 该条目将从未完成连接队列搬到已完成连接队列的队尾.当进程调用函数accept时, 将已完成连接队列中的队头条目烦恼会给进程, 如果此时队列为空, 进程将睡眠, 直到有条目放入已完成连接队列中.
4: int accept(int sockfd, struct sockaddr *clladdr, socklen_t * addlen)
调用accept接口服务端已经处于ESTABLISHED状态, 该接口被调用时, 表示从已完成连接队列中取出队头的一个连接, 如果接口调用成功将返回一个已完成连接的TCP连接(全新描述符), 后面的发送和接收数据都需要传入该已完成的TCP连接描述符, 而传入该接口中第一个参数sockfd表示该服务器的一个全局唯一的监听socket描述符, 该监听描述符一直存在, 直到服务器关闭才会消失, 而已连接socket描述符(accept返回的)的生命期是连接的生命期, 关闭了连接则该描述符就被内核收回.
5:并发服务器服务器框架?
在这里插入图片描述
由上代码, 服务器绑定IP, 端口, 建立监听后, accept会轮询处理客户发过来的连接, 当客户和服务器成功建立连接后, 服务器会创建一个子进程, 由子进程来处理客户的业务(pid == 0), 父进程(pid > 0)则调用close关闭父进程和客户的连接, 子进程中关键监听socketfd, 然后处理客户业务, 业务处理完后, 关闭连接sockfd, 注:此种父进程调用close接口, 并不会关闭连接, 只是将该连接的引用计数减一, 由2减为1, 引用计数不为0, 不会关闭连接, 在父进程Accept拿到该连接时, 引用计数为1, 当创建子进程时, 该连接会被子进程共享, 引用计数加1, 故创建子进程后该连接的引用计数为2, 只有当该连接的引用计数为0时,才会断开连接, 走四次挥手流程.
我们必须意识到, 如果父进程不对每个accept返回的已连接套接口调用close, 并发服务器将会发生什么? 首先, 父进程最终将耗尽可用的描述字, 因为任何进程在某时刻打开描述字数总是有限的, 但更重要的是, 没有个客户连接被终止, 当子进程关闭已连接套接口时, 它的访问计数值由2减为1, 且保持1, 这将导致TCP连接无法终止, 连接永远开放着.
6异步IO模型和信号驱动IO模型的区别?
信号驱动I/O是由内核通知我们合适可以启动一个IO操作, 而异步IO模型是内核通知我们IO操作何时完成的.
在这里插入图片描述
在这里插入图片描述
7:IO模型比较
在这里插入图片描述
8:select监听的最大网络文件描述符是多少?
一般是1024, select因为采用轮询监听模式, 故网络文件描述符越大,则监听效率越低, 这个最大监听数据一般定义在系统头文件中.
9:描述字在什么条件下准备好读?
在这里插入图片描述
10:描述字在什么条件下准备好写?
在这里插入图片描述
11:shutdown(int sockfd, int howto)函数中第二个参数指定了shutdown的行为, 分别具有哪些行为?
SHUT_RD : 不论哪种行为, 都会引发FIN, 不会理会套接字的引用计数(和close的关键), 关闭连接的读一边, 接受缓冲区清零, 发送缓存区可正常发送, 不能再对套接字进行任何的读. 调用此函数后 TCP接受的任何数据都会确认, 但确认后丢掉.
SHUT_WD: 关闭连接的写一边, 发送缓存区可正常发送, 发送完后 ,正常四次挥手. 不可以再往套接字写.
SHUT_WDRD: 两者结合, 先调用SHUT_RD在调用SHUT_WD
12:tcp setsockopt函数中 SO_KEEPALIVE套接口选项详解?
在这里插入图片描述
13: TCP 中shutdown和close的区别?
在这里插入图片描述
14:TIME_WAIT状态?
在这里插入图片描述
在这里插入图片描述
15:有名管道(FIFO), 无名管道(Pipe)区别?
有名管道, 顾名思义有名字, 有名字就有姓, 有姓的话, 就没有父子进程间的限制,
无名管道, 没有姓名, 故必须父子进程间通信, 父子进程姓是一样的, 故无名.
16:select 和 epoll的区别? 两者将文件描述符存储在哪?
select将文件描述符存在数组中, epoll将已注册的文件描述符存储在内核的红黑树中,
已注册的描述符在内核中会被维护在一棵红黑树上,通过回调函数内核会将 I/O 准备好的描述符加入到一个链表中管理,进程调用 epoll_wait() 便可以得到事件完成的描述符
17:拥塞控制
在这里插入图片描述
18:TCP Zero Winows?
在这里插入图片描述
窗口大小字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。win为0那就表示目前的一方TCP没有缓冲区了,告知对方不要发送数据过来了,如果长时间多次告知对方win为0会怎么样呢?根据TCP协议的设计原理,A告知B窗口为0,那么B会启动一个持续定时器每间隔一定时间来监测A的窗口是否打开,也即探测A是否有空间可以接收数据了,如果达到一定次数的探测还未打开则会断开连接。

Win值为0一般是上层应用消费数据较慢获取不收数据造成。(例如回放过程中,设备全速推流,上层应用解码播放消耗较慢导致TCP窗口满无法再接收额外的数据)

19:TCP Window Full?
TCP windows Full是指我这边的发送窗口满了,没法给对端你发数据了(所有我发的数据你都没有给我ACK确认)
在这里插入图片描述
20:主动关闭的一方存在大量TIME_WAIT状态
出现这种情况一般因出现大量并发的短连接, TIME_WAIT因为需要登录2MSL大概4分钟左右才会消失, 避免有脏数据,
解决方法:
【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—基础知识篇
https://blog.csdn.net/slvher/article/details/8941873?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.not_use_machine_learn_pai
tcp短连接TIME_WAIT问题解决方法大全(2)——SO_LINGER
https://blog.csdn.net/yunhua_lee/article/details/8146837

猜你喜欢

转载自blog.csdn.net/yuyixiong/article/details/106850877