TCP는 전송된 세그먼트가 손실 되거나 순서가 어긋났을 때,
혹은 중복되었을 경우 이에 대한 제어나 처리를 하는 기능이 있다.
그 중 하나의 방법이 TCP 에러제어 이다.
TCP 에러제어는 먼저 에러를 검출하는 과정을 거치며, 그 방법으로 CRC와 체크섬을 사용한다.
TCP 헤더에는 체크섬이라는 필드가 있다.
이 체크섬 필드는 헤더와 데이터에 대한 에러를 검사하는 기능을 통해
세그먼트가 전송되는 도중 에러가 발생했는지 확인한다.
에러를 검출한 후에는 에러를 정정하는 과정을 거치는데,
에러정정은 ARQ(Automatic Repeat Request) 방식을 사용한다.
재전송 방식에는 Stop and Wait ARQ, Go-Back-N ARQ, Selective Repeat ARQ 방식등이 있다.
1 ) Stop and Wait
Stop and Wait 재전송 방식은 이름 그대로 멈추고 기다리는 방식이다.
타임아웃이 되어도 ack 를 받지 못하면 패킷을 재전송하는 방식이다.
PC A 에서 0번 패킷을 전송했다고 가정해보자.
그럼 PC B 에서는 0번 패킷을 수신하고 그에 대한 확인 응답으로 0번 ACK 를 전송한다.
A는 0번 ACK 를 확인하면 1번 패킷을 전송한다.
B는 1번 패킷을 수신하고 그에 대한 응답으로 1번 ACK 를 전송한다.
그러나 도중 1번 ACK가 손실되어 A에게 도착하지 못하면 A측의 타이머가 타임아웃 되어서
A측에서 다시 1번 패킷을 재전송하게 된다.
이와 같은 방식으로 매번 전송한 패킷에 대한 확인 응답(ACK) 를 받고
그 다음 패킷을 전송하는 방식이 Stop and Wait 방식이다.
그리고 Stop and Wait 방식은 식별을 위해서 0,1 의 패킷 혹은 ACK 를 번갈아 전송한다.
이렇게 확인응답이 올때까지 기다리는 방식이기 때문에 비효율적이라는 단점이 존재한다.
2) Go-Back-N
Go-Back-N 방식은 패킷 송신중 에러가 발생하였을 경우에 뒤로 돌아가서 다시 재전송하는 방식이다.
Go-Back-N 재전송 방식은 어느 한 패킷이 돌아오지 않아 에러가 발생하였으면
에러가 발생한 패킷부터 다시 재전송하는 방식이다.
즉, 뒤로 돌아가서 다시 순서대로 재전송하는 방식이다.
A 측에서 0,1,2 번 패킷을 전송한다고 가정하자.
이중 0번 패킷과 2번 패킷은 B가 수신하여 각각 ACK 를 전송하였다.
그러나 1번 패킷은 전송 도중 손실되거나 오류가 발생하여 B가 수신하지 못한다.
그렇게 될 경우에 A는 1번 패킷에 대한 ACK 를 받지 못해 타이머가 타임아웃된 상태가 된다.
이때 B는 패킷3과 패킷4는 정상적으로 도착했지만 1번 패킷이
아직 도착하지 못하였으므로 0번 ACK 를 전송한 상태에서 멈추게 된다.
즉 1번 패킷이 도착할 때까지 0번 ACK 만 계속 보내는 것이다.
(마지막으로 성공한 ACK 번호가 0번이라 0번을 계속 보내는 것이다.)
타이머가 타임아웃 되어서 A가 패킷을 재전송 할 때 다시 순서대로 패킷 1,2,3 순서대로 보낸다.
3) Selective Repeat
Selective Repeat 재전송 방식은 오류가 발생한 패킷을 선택적으로 재전송 하는 방식이다.
A에서 0,1,2 번 패킷을 전송한다고 가정해보자.
이중 1번 패킷을 송신하는 도중에 오류가 발생했다고 가정해보자.
그럼 B는 0,2 번에 대한 ACK 를 전송할 수 있지만 1에 대한 ACK 값은 전송하지 못한다.
B는 1번 패킷을 수신하지 못했기 때문에, 2번 패킷을 수신했을 시 버퍼에 기록하고,
수신한 패킷에 해당하는 ACK 를 선택적으로 전송한다.
전송이 계속되면서 B에게 3번 패킷과 4번 패킷도 도달하게 되는데
B는 이를 수신하고 그에 대한 3번 ACK, 4번 ACK 를 전송한다.
그리고 이를 수신한 B는 여전히 1번 패킷을 수신하지 못하였기 때문에 버퍼에 기록한다.
1번 패킷에 대한 확인 응답이 A에게 도착하지 않아서 타임아웃이 되면 A에서 1번 패킷을 재전송하게 된다.
B는 1번 패킷을 수신한 후 그에 대한 응답으로 1번 ACK를 전송하고
1번 패킷과 함께 버퍼에 저장해두었던 값들을 상위계층으로 올린다.
'네트워크' 카테고리의 다른 글
[네트워크] TCP 혼잡제어 (0) | 2022.10.07 |
---|---|
[네트워크] TCP 흐름제어 - Sliding window (0) | 2022.10.06 |
[네트워크] 3-way handshake, 4-way handshake (0) | 2022.10.04 |
[네트워크] TCP header (0) | 2022.10.03 |
[네트워크] 전송계층의 정의 (0) | 2022.10.02 |