卷1前三章知识点汇总

来源:互联网 发布:淘宝卖家发快递3元包邮 编辑:程序博客网 时间:2024/06/07 00:38

--------------------------------------《1》---------------------------------------------

   尽管客户和服务器之间使用某个应用协议通信,传输层却使用TCP通信。注意,客户和服务器之间的信息流在其中

一端是向下通过协议栈的,跨越网络后,在另一端则是向上通过协议栈的。另外注意,客户和服务器通常是用户进程的,

而TCP和IP协议通常是内核中协议栈的一部分。

--------------------------------------《2》---------------------------------------------

   OSI模型的低下两层是随系统提供的设备驱动程序和网络硬件。通常情况下,

   除需知道数据链路的某些特性外,我们不必知道这两层的具体情况。


   网络层有IPv4和IPv6这两个协议处理。可以选择的传输层协议有TCP或UDP。

   TCP和UDP之间留有缝隙,表明网络可以绕过传输层直接使用IPv4或IPv6是可能的。

   这就是原始套接字

  OSI模型的顶上三层被合并为一层,称为应用层。这就是Web客户,Telnet客户,Web服务器,

Ftp服务器和其他我们在使用的网络应用所在的层。对于网际协议,OSI模型的顶上三层协议

几乎没有区别

--------------------------------------《3》---------------------------------------------

请看下文(自己改了一点)

三次握手:“喂,你听得到吗?”“我听得到呀,你听得到我吗?”“我能听到你”--------------------------------------两次握手:“喂,你听得到吗?”“我听得到呀”“喂喂,你听得到吗?”“草,我听得到呀!!!!”“你TM能不能听到我讲话啊!!喂!”“……”------------------------------------------四次握手:“喂,你听得到吗?”“我听得到呀”“你听得到我吗?”“我能听到你”“……”作者:匿名用户链接:https://www.zhihu.com/question/24853633/answer/114872771来源:知乎
--------------------------------------《4》---------------------------------------------
  TIME_WAIT状态有两个存在的理由:
1> 可靠的实现TCP全双工连接的终止
2> 允许来的重复分节在网络中消逝
//  MSL(maximum segment lifetime 最长分节生命期)

1)可靠地实现TCP全双工连接的终止

TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)

发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护

状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处

于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中

会抛出connection reset的SocketException)。

因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢

失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。

2)允许老的重复分节在网络中消逝

TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个
分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能
会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,
“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个
情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAI
T状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经
在网络中消逝。
//自己的理解:客户端关闭后重新bind原端口,经常出现端口被占用,就是因为之前的连接
还在TIME_WIAT状态。TIME_WAIT状态不允许发起新的连接,所以在TIME_WAIT期间的旧
的重复分组就不会被误认为是新的连接。而其2MSL,保证了某个方向上的分组最多存活
msl后被丢弃,另一个方向上的应答最大存活msl也被丢弃
--------------------------------------《5》---------------------------------------------

--------------------------------------《6》---------------------------------------------
第五部分和第六部分两张图。
TCP的发送接收是有缓冲区的,即内核缓冲区到用户进程空间缓冲区。TCP的write返回成功
只能说明,数据已经写到了内核缓冲区。而UDP的write返回成功,则说明数据已经加入到了
数据链路的输出队列。TCP的内核缓冲区只有确认了数据被对方接受后,才会删除缓冲区中
的数据。TCP有分节,每个节的大小MSS。UDP则没有。但是两者都有分片。IP协议吧数据
传递给数据链路之前有可能会给数据分片。
1、数据链路层对数据帧的长度都有一个限制,也就是链路层所能承受的最大数据长度,这个值
称为最大传输单元,即MTU。以以太网为例,这个值通常是1500字节。

2、对于IP数据包来讲,也有一个长度,在IP包头中,以16位来描述IP包的长度,也就是说,
一个IP包,最长可能是65535字节。

3、结合以上两个概念,第一个重要的结论就出来了,如果IP包的大小,起过了MTU值,那么就需要
分片,也就是把一个IP包分为多个,这个概念非常容易理解,一个载重5T的卡车,要拉10T的货,它
当然就得分几次来拉了。
--------------------------------------《7》---------------------------------------------

--------------------------------------《8》---------------------------------------------
#include <arpa/inet.h>int inet_aton(const char * strptr, struct in_addr *addrptr);//若字符串有效则为1,否则为0in_addr_t inet_addr(const char * strptr);//若字符串有效则为32位的二进制网络字节序的IPv4地址,否则为INVALID_NODEchar * inet_ntoa(struct in_addr inaddr);//指向一个点分十进制数串的指针int inet_pton(int family, const char * strptr,void * addrptr);//若成功则为1,若输入不是有效的表达式则为0,出错则为-1const char * inet_ntop(int family,const void * addrptr, char * strptr,size_t len);//若成功则为指向结果的指针,若出错则为NULL第二个函数几乎已经被废弃。最后两个适用IPv4和IPv6.注意inet_addr的返回值是in_addr_t,即s_addr其他都是sin_addr.最后两个是void *,ANSI 标准之前没有VOID *,为了适应各种套接字协议,才采用了sock_addr的通用结构,包括前面三个函数的参数。后来出现的inet_ntop和inet_pton函数的参数已经可以使用void *.不过内部还是会转换为sockaddr结构的。函数参数>=两个的,都是从左到右。s代表ascII.p代码表达,一般也是ASCII.n代码numeric数值。

拥塞控制与流量控制:https://www.cnblogs.com/newwy/p/3254029.html
分片与分节:http://blog.csdn.net/singular2611/article/details/52513406
TIME_WAIT机制:http://elf8848.iteye.com/blog/1739571

原创粉丝点击