1:建立TCP的各个系统调用

上图给出了TCP服务器和客户端所需要的系统调用
来自IBM
上图中从上到下各层分别为TCP应用->套接字层->协议层->接口层->物理层
其中套接字层负责接收任何TCP的系统调用,验证上层传递参数的正确性
协议层负责对协议的实现(TCP),接收上层调用,两个层之间共享的数据结构具有独占访问权限,避免任何数据结构损坏。
接口层运行网络设备驱动程序,该层从物理层接收数据,并向物理层传输数据
每个套接字具有一个套接字队列,并且每个接口具有一个用于数据通信的接口队列。不过,对于整个协议层,只有一个称为 IP 输入队列的协议队列。接口层通过此 IP 输入队列将数据输入到协议层。协议层使用相应的接口队列将数据输出到接口。

来自Shining-LY
**socket网络编程中的系统调用:**这与建立TCP所需的系统调用相同,请参考socket网络编程
除了连接所指的系统调用外,还有以下调用:
shutdown (struct proc *p, struct shutdown_args *uap, int *retval);
Struct shutdown_args
{
int s;
int how;
}
在 shutdown 系统调用中:
s 是套接字描述符。
how 指定将关闭哪一部分连接。how 的值 0、1 和 2 分别指定关闭连接的读取部分、写入部分和同时关闭连接的读取及写入部分。
shutdown 系统调用关闭连接的任意一端或两端。如果需要关闭读取部分,则会丢弃接收缓冲区中存在的任何数据,并关闭该端的连接。对写入部分,TCP 发送任何剩余的数据,然后终止连接的写入端。可以看出shutdown函数对四次挥手的过程做了拆分。
soo_close(struct file *fp , struct proc *p);
close 系统调用可关闭或中止套接字上任何挂起的连接。
在套接字中存在一个引用计数,计数方式是父进程加子进程的和。
close函数会去查引用计数,如果为0,执行TCP的四次挥手过程,如果大于0,则减一。
调用之后,TCP连接已经断开,这个时候其上调用write或者read函数则会产生错误码为9即EBADF的错误。
调用close时,如果协议栈中还存在等候发送的数据,则受俩个参数的控制,如下表

close与shutdown的区别:
1、是否触发四次挥手
close:只是减少套接字描述符的计数,如果计数为0ÿ
本文详细介绍了计算机网络面试中的重点,包括TCP建立连接的三次握手、路由协议(RIP和OSPF)、TCP与UDP的区别、端口号分配、HTTP请求报文首部、网页解析流程、IP分片的原因与实现、TCP的四次挥手和超时重传机制,以及TCP如何确保数据传输的可靠性,涵盖了从连接建立到数据传输的各个环节。
最低0.47元/天 解锁文章
&spm=1001.2101.3001.5002&articleId=82145925&d=1&t=3&u=55e10e22974343c1a5623091b157c0ef)
800

被折叠的 条评论
为什么被折叠?



