2016-09-23 4 views
0

하나의 TCP 스택을 구현하려고합니다. 내가 따랐다 다음 단계 :TCP 흐름 제어 오류

  1. TCP의 개방 :

    을 수행합니다. 클라이언트는 초기 시퀀스가 ​​"C"이고 Ack no가 "0"인 'SYN'을 서버에 보냈습니다.

    b. 서버가 seq no "S"및 ack no "C + 1"인 SYN + ACK로 응답했습니다.

    c. 클라이언트는 "C + 1"시퀀스 및 "S + 1"ACK가없는 ACK + PSH를 보냅니다.

  2. TCP의 전송 및 RECV :

    가. 클라이언트는 ACK 플래그 및 데이터 에 seq no "C + 1"및 ack no "S + 1"이 포함 된 데이터 요청을 전송합니다.

    b. 보낸 사람은 세그먼트에 "S + 1 + data"라는 seq가없는 세그먼트를 보내고 수신기는 FIN 또는 RST가 전송 될 때까지 "S + 1 + data"가없는 ACK를 보냅니다.

제 경우에는 데이터 전송 중에 패킷이 거의 없지만 wireshark에서 볼 수 있습니다.

일련 번호와 ACK 번호를 사용하기 위해 데이터의 출력 및 패킷 손실을 확인하고 예상되는 다음 순서보다 시퀀스 번호 이상에서 세그먼트를받는 경우 다시

+0

저수준 tcp를 쓰고 계시거나, 쓰기 및 받기에 시스템 기능을 사용하고 있습니까? – HeadCode

+1

저수준 tcp – Pawan

답변

1

을 패킷을 얻을 수있는 메커니즘이, 마지막으로 ACK을 다시 보내야합니다. 송신자에게 세그먼트의 일부가 유실되었음을 알리고 승인을 기다리는 모든 세그먼트를 즉시 재전송해야합니다.

더 나은 해결 방법은 RFC 2018에있는 Selective Acknowledgement 옵션을 구현하는 것입니다. 이렇게하면 잘못된 순서로 수신 된 세그먼트를 인식 할 수있게되고 송신자는 누락 된 세그먼트 만 재전송합니다.

+0

마지막 ACK를 보내면 마지막 ACK로부터 패킷을 보내기 시작합니다. 그렇지 않으면 처음부터 전송을 시작합니다. – Pawan

+0

마지막 ACK로부터 다시 전송됩니다. – Barmar

+1

이미 승인 된 것은 재전송되지 않습니다. – Barmar