您的位置:首页 > 理论基础 > 计算机网络

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

2018-02-01 23:46 246 查看

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:连接被关闭。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c socket