zoukankan      html  css  js  c++  java
  • TCP/IP 学习 --- 2

    tcp协议格式

    1 上图为tcp和udp协议格式

    2 tcp有发送和接收缓冲区,每次发送多少字节和读取多少字节,没有固定量,根据mss,tcp自动进行分发报文。但是udp不同,每一个发送操作对应一个读操作,否则会丢包。

    3 序号值会被系统初始化为一个随机值isn,那么在该方向上发送的消息的序号值时该tcp报文段数据部分第一个字节相对于整个字节流头部的偏移量加上这个isn值,例如某个tcp报文段的数据是第1025-2048字节,那么其序号值为isn+1025。确认号为序列号+1

    4 URG标志位表示紧急指针是否有效。ACK标志位表示确认号是否有效。PSH标志位表示接收端应用程序应立即从TCP缓冲区中读走数据(一般来说,每一次 write,都会将这一次的数据打包成一个或多个 TCP 报文段(如果数据量大于 MSS 的话,就会被打包成多个 TCP 段),并将最后一个 TCP 报文段标记为 PSH)表示一个完整的消息包结束。只要接收方的缓冲区没有满,就会一直等待,直到接收到一个带有PSH标志的报文,read才回返回。RST标志表示要求对方重新建立连接。SYN标志表示请求建立一个连接。FIN标志表示通知对方本端即将关闭。

    5 如果A端向B端发送SYN,当时没有收到B端回复,A端会发送6个序号一致的同步报文段,其间隔为1S、2s、4s、8s、16s、32s。指数增长。

    断开连接过程

    7 tcp出现连接时的四次握手状况:

    当TCP连接双方几乎同时向对方发送SYN同步报文段请求连接,随后进入到SYN_SEND状态。接到对方的SYN后进入SYN_RCVD状态各自返回一个ACK。双方收到对方的ACK进入ESTABLISHED。同时打开的时候没有服务器和客户端的概念,并且一共会发送4个报文段,而不是正常三次握手中的3个

    8 当客户端发送ACK给服务器端后要进入2MSL的TIME_WAIT时间,MSL是报文段最大生存时间,RFC1122中定义这个时间一般为2min。等待这端时间的目的是防止由于网络原因服务器端未收到这个ACK回复,重传了上一个FIN报文段,如果不进入TIME_WAIT状态则服务器端一旦接收不到ACK,就会维持连接,消耗内核资源。所以在实际编程过程中,我们会经常发现多次测试重复绑定socket的时候会出现端口被占用的错误,这就是端口仍处于TIME_WAIT状态不能被使用,可用socket选项SO_REUSEADDR来强制立即使用端口。

    9 TCP发送携带RST标志的复位报文段以通知对方关闭连接或重新建立连接。一般有三种情况:1)访问不存在的端口,这点在上面的①中已经说明;2)异常中止连接,当一方向另一方发送复位报文段时,发送端所有排队等待发送的数据皆被丢弃,在编程过程中,可以使用socket选项的SO_LINGER来发送复位报文段以异常终止一个连接;3)处理半打开连接,当通信双方建立连接后,若其中一方网络断线,而另一方此时并不知情,此时断线方网络重连,没有了该连接的信息,即处于了半打开状态,另一方继续向对方发送数据,此时由于对面连接已经被关闭,所以对方会返回一个复位报文段以重新连接。

    10 发现网络拥塞的依据:1、传输超时 2、收到两个重复的确认报文段。

    一名潜心学习的服务器端初级人员
  • 相关阅读:
    通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(三)
    通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)
    stepper组件使用
    解决循环删除list中元素ConcurrentModificationException异常问题
    简单选择排序SelectSort
    用js写出简单的计算器
    在一个项目中,添加.js文件出现错误
    弹出当前值以及修改
    映射:表之间的关联
    置换(用递归的方法执行置换)
  • 原文地址:https://www.cnblogs.com/zanyouxin/p/9203842.html
Copyright © 2011-2022 走看看