UNIX网络编程第一二章读书笔记

uInternet:使用TCP/IP协议组成的网络

internet:使用各种协议组成的网络

Internet是一种internet,反之则说法错误。


bzero起源于Berkeley

memset起源于ANSI


read返回0表示对端关闭了连接,不论是阻塞还是非阻塞都是这样

read返回负值表示出现了错误,比如中断等


线程类函数失败时不设置errno,是通过返回值表示错误,统一起见可以把返回值赋值到errno,接下来调用err_sys打印出错误信息


应用程序使用原始套接字可以绕过传输层

应用程序使用数据链路接口可以绕过网络层


 Austin Common Standards Revision Group  整合了POSIX和OpenGroup,形成了最终的 unix 3.x


第二章:

TCP特性:

1,面向连接

2,可靠传输,确切的说是尽可能可靠传输+故障通知;重传依赖的一个重要的点是 RTT估算

3,收发排序,确保收到完整有序的数据

4,流量控制,发送窗口控制发送速度。

5,TCP连接是全双工的。


TCP连接的三路握手过程:

前提:服务器调用socket,bind,listen来完成被动打开

1,客户端调用connect进行主动打开,客户TCP会发送一个SYN

2,服务器对客户端的SYN发送ACK进行响应,并且发送SYN分节,通知客户端发送数据的初始序列号;ACK表示期望收到客户端的下一个分节的序列号,SYN+1

3,客户端对服务端的SYN进行ACK确认

说明:为什么SYN要占一个字节的序列号空间?SYN没有携带任何数据啊?

TCP协议是可靠传输协议,除了数据部分,开始和结束命令也需要进行确认,SYN和FIN都需要进行确认,所以就统一按照数据的方法来增加序列号实现了。

http://blog.sina.com.cn/s/blog_93b45b0f0101r4ty.html

https://www.zhihu.com/question/24792770;这两篇文章回答的都比较好。


TCP断开的四次握手

1,主动关闭的一方发送FIN;

2,TCP协议栈对FIN进行确认,并且放到缓冲区末尾。

3,应用进程收到了对端发送的FIN,处理完成之后也执行关闭,发送FIN到对端;

4,主动关闭的一方发送ACK进行确认。

至此连接关闭完成。

TCP连接建立时状态转换图

服务器端listen之后会处在listening状态

客户端执行主动打开,发送SYN后会进到SYN_SENT状态;

服务器收到客户端发送的SYN后对SYN进行ACK,并且发送服务器端的SYN,进入到SYN_RECEVED状态;

客户端收到服务器的ACK,并且对服务器的SYN进行ACK确认,进入到ESTABLISHED状态

服务器收到ACK后进入到ESTABLISHED状态。


TCP连接断开时状态转换图

假设客户端先关闭连接

客户端发送FIN报文,状态从ESTABLISHED转换为FIN_WAIT_1;

服务器协议栈发送ACK,变成CLOSE_WAIT;

客户端收到服务器端发送的ACK,从FIN_WAIT_1转换为FIN_WAIT_2;

应用进程收到客户端发送的FIN后,也执行关闭操作,发送FIN报文,状态转换为LAST_ACK?

客户端收到服务器端的FIN报文,发送ACK,状态转换为TIME_WAIT状态,并且状态保存2MSL时间。

服务器收到客户端的ACK后,状态转换为CLOSED。


为什么执行主动关闭的一方最终的状态是TIME_WAIT?为什么需要维持2msl

TCP是可靠的通信协议,最后发送给服务器端的ACK有可能会丢失,也就意味着服务器端会再次发送FIN,客户端需要响应。

msl指的是包的最大生存时间(虽然msl其实是一个指示最大跳数),TIME_WAIT保存2msl也就意味着过来的包和发出去的包都会在这段时间内在网络上消失,如果再次建立一个相同的四元组连接,那么网络上就不会有之前连接的数据报存在。

这个msl和FIN重发说的是两个不同的点,在TIME_WAIT状态不会再收发除了FIN ACK之外的任何数据,收到也是丢弃操作,服务器端的FIN在LAST_ACK状态下应该也只会重发一次,还有FIN的重试时间应该是比msl小的多的一个时间。

这里有个点,我一直在纠结:如果服务器在LAST_ACK没有收到客户端的ACK,会进行重发,那么服务器端再次发出FIN,到客户端收到回应ACK,其实已经过了一段时间,但是在2msl以内,但是在发出不久后time_wait状态就超过2msl了,但是发出的ack还在传输中,那么这种状态是如何处理?服务器端应该在LAST_ACK也会维持一段时间?只要四元组满足不了就不会有问题。



TCP端口号:

通用的端口是在因特网已分配数值权威机构IANA(international Assigned Numbers Authority)维护着,

众所周知的端口0-1023,IANA控制,对于UNIX也需要特权用户才能使用。

1024-49151不受IANA控制,但是会登记使用情况。

49152-65535私用端口。


MTU指的是最大传输单元(maximum transmission unit)由硬件决定,是一个数据链路层使用的概念,在因特网里面是1500

MSS是最大分节大小(maximum)是一个TCP层的概念,目的是用于向对端TCP通告每个分节中能发送的最大TCP数据值,这样就不用在IP层再进行切片。一般都是MTU减去TCP以及IP头部大小,注意没有链路层大小,也就是MTU不是发送出去的包大小值,加上数据链路层头部才是实际发送物理包大小。

IP层切片是根据MTU的大小进行的。

猜你喜欢

转载自blog.csdn.net/xiaoyilong2007101095/article/details/79720521