Linux网络实验
netstat
netstat -natp
# n 是直接获取IP而不是域名
# a 所有的socket链接
# t tcp
# p 显示进程的名字以及pid
tcpdump
tcpdump
# 打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析。
# 监控eth0接口的网络情况
lsof
lsof -p pid
# 显示Linux系统当前已打开的所有文件列表
# 可以用来查看监听的文件描述符
strace
追踪后面的可执行程序的系统调用,会输出一些文件,查看文件里面就可以知道执行的一些具体的系统调用。
strace -ff -o out /usr/java/javasdk/bin/java TestSocket
例如请求到来的时候会新建一个线程,执行clone方法
man

建立连接与接收数据(唯一连接-->唯一四元组-->唯一文件描述符)(内核握手与用户accept)
开启服务端,不accept,只是开启端口
开启客户端,客户端连接服务端,三次握手建立sockcet连接,开辟资源(建立了文件描述符来描述这个四元组连接,一个四元组对应的文件描述符FD是唯一的),发送数据之后,由于服务端没有accept,所以服务端是由内核先接受在缓冲里面,服务端accept之后就可以获取数据。
四元组可以让连接变得清晰和唯一,所以服务端只需要一个固定的端口就可以唯一标识每一个连接。
有没有执行accept 就是这个四元组有没有被领走。
65535:四元组只要不一样就可以,下面的唯一不一样的就是服务端的端口,所以我们在启动服务的时候不能端口号冲突,否则分不清。



BACK_LOG以及buffer导致连接失败以及内核数据遗失
内核会不会帮你无限缓存所有的连接,无限四元组,不会。
- BACK_LOG : 限制连接数,超过之后就不会接收了!
- buffer : 是限制某一个连接最大传输的数据。达到限制大小内核就不会接受,后面的都会丢弃。使用accept开始接受的时候只能得到之前发的数据



上面记录一下,后面就会失败消失
TIMEOUT
accept之后,等多少秒会抛异常,阻塞会抛异常。保证一个socket不消耗资源,连上不发东西。
抓包三次握手
nc
MTU:1500Byte,1.5KB,整个数据包的大小

MSS:真实数据的大小,去除固定的请求头的大小
自己发送序列号seq,窗口大小(流式计算)

对方回复seq+1,
三次握手之后会协商一个窗口的大小,最初起始客户端窗口是14600,之后服务端窗口的大小是1448,之后的最终协商的窗口大小是115
服务端跑起来和accept是两回事。
keepalive
双方建立连接之后好久不说话的话,
tcp(两小时)和http(应用自己定义)都是有的,两边会发一些数据,为了后续使用维持。
posted on 2025-10-12 21:35 chuchengzhi 阅读(10) 评论(0) 收藏 举报
浙公网安备 33010602011771号