UNIX网络编程第三版(卷1)读书笔记以及习题-章节2

本文是UNIX网络编程第三版(卷1)章节2的读书笔记,详细介绍了TCP和UDP的区别以及连接过程。TCP是可靠的全双工通信协议,通过三次握手建立连接,四次挥手断开连接。而UDP则是不可靠协议,数据直接发送,无缓冲区。此外,还解释了netstat中ESTABLISHED和TIME_WAIT等状态的含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 几个关键点
  • 常用连接协议TCP、UDP的特点:

    • TCP:可靠的,全双工(同一时刻,允许数据在两个方向上同时传输)通信协议。

      • 完成一次连接需要进行3次握手:客户端发起请求(SYN) —— 服务器收到客户端请求(SYN)并返回确认(ACK) —— 客户端收到服务器确认(ACK)并发送确认的确认(ACK) —— 服务器收到客户端确认(ACK),建立连接。
      • 完成一次断开需要进行4次握手:主动关闭方发送(FIN) —— 接收方发送回复(ACK) && 接收方发送(FIN) —— 主动关闭放发送回复(ACK) —— 接收方收到回复(ACK),关闭连接。
      • 一个完整的请求流程:
        • 当服务器bind一个套接字的时候,一般服务器是一个多宿(简单理解为多个IP地址,一般bind一个端口,一个外网IP一个内网IP,例如xxx.xxx.xxx.xxx:21和192.168.1.100:21)的绑定。会生成一个套接字对,对应4节数据(本机地址:本机端口,对端地址:对端端口),初始绑定时,内容相当于( * :21;* : * ),*是通配符。
        • 客户端连接成功之后,客户端也会生成一个套接字对,例如(192.168.1.110:1500;192.168.1.100:21)这里的本地端口,客户端会开启一个空闲端口。
        • 服务器不管是否会开启新线程去处理连接,当客户端连接后,之前的套接字对会绑定客户端的IP和端口,例如(192.168.1.100:21;192.168.1.110:1500),如果开启了新线程,线程会绑定上述的套接字对,主进程依然是初始化的状态继续监听。
      • 一个完成的数据包装流程:
        • 程序调用write方法,会将原本程序缓冲区的数据尝试写入到套接字发送缓冲区(SO_SNDBUF),如果出现发送缓冲区不足,这时程序就会阻塞知道将需要写的数据全部写完。注意:全部写完之后write就会返回成功,这时候并不能代表服务器已经收到数据。
        • 接着进入传输层,本机传输层会将数据按照MSS大小(最小536字节)分块,拼上TCP头和尾。
        • 接着传入网络层,网络层可能会进一步给数据分节,并拼上IP头和尾。
        • 接着传入链路层,插入带发送队列中,这时如果队列已满,会抛弃该节数据,并向上返回错误。上层会进行重试,并不会将错误返回给应用层。
        • 接着进行网络传输,中间会不断的收到服务器的ACK确认,只有当最终传输完毕后,收到了服务器的确认,本地才会抛弃套接字缓冲区的缓存。
    • UDP:不可靠的通信协议。

      • 和TCP的最大区别是数据包装的时候,因为本身是不可靠的,因此并没有套接字缓冲区缓存UDP数据,经过传输层、网络层分片、增加对应头尾后,直接发送,如果发送队列已满,会直接抛弃该数据包,内核会返回给应用程序一个ENOBUFS错误,但是有些实现不返回该错误,这时,本机也许就直接抛弃了。
  • netstat查看进程常见状态解释:

    • ESTABLISHED:TCP连接被建立的时候,正常状态。
    • TIME_WAIT:根据之前关闭的四次握手,当接收方发送了FIN等待最后一个确认到达之前就会转变为该状态。
    • CLOSED:连接被关闭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值