
이 포스팅은 [Computer Networking: A Top-Down Approach]을 바탕으로 작성되었습니다.
열심히 공부하고 올리는 포스팅이지만... 저는 그저 말하는 감자이므로 정확하지 않은 내용도 포함될 수도 있습니다..
TCP 의 특징 7가지

1.point to point
하나의 sender와 하나의 receiver가 connection을 수립한다
2.reliable,in-order byte stream
message를 byte stream으로 인식한다.
message 단위로 인식한다면 "안녕" "만나서 반가워" 이렇게 데이터를 전송하겠지만
byte stream,즉 byte의 흐름이므로 "안녕 만나서 반가워" 이런식으로 전송한다.
그렇다면 tcp는 모든 패킷을 합쳐서 보내는가?
아니다.
tcp는 segmentation 과정을 거친다.
byte stream을 MSS(max segment size)단위로 쪼개게 되므로 여러개의 패킷이 발생한다.
3.full duplex data
full duplex란 양방향 통신을 뜻한다.
simplex(단방향 ex-라디오) -> helf duplex -> full duplex(양방향 ex-전화)
sender와 receiver가 동일한 connection을 통해 양방향 통신을 한다.
이때 3-way connection 쉽게 말하자면 3번의 대화를 거친 후 connection을 수립한다.
예를 들어보겠다.
A: B야 안녕! 나 A인데 너한테 데이터 보내도 될까?
B: A야 반가워,응 당연하지! 나도 너한테 데이터 보내도 되니?
A: 응응!
뭐..간단하게 표현했는데(간단하게 배우기도 함)
이런식으로 세 번의 대화를 한다.
4.cumulative ACKs
ACK이 누적된다. 이건 좀 이따 예시를 통해서 설명해주겠다!
5.pipelining
pipelining을 통해 한 번에 여러 패킷을 전송할 수 있다.
사실 이 개념은 네트워크는 아니고 컴퓨터 구조 시간에 배울 것이다.
이것도 나중에 예시로 나올테니 그때 알아보자
6.connection-oriented
데이터 전송이 connection 수립 후에 이루어진다는 뜻이다.
udp의 경우 connectionless 즉 connection이 없다..!
sender가 receiver가 서로 대화하면서 적당히 데이터 보내야하는데 udp는 상대 의사도 묻지 않고 막 보낸다.(꽤나 이기적)
7.flow controlled
flow control이라고도 부른다. receiver가 받을 수 있는 최대 데이터양을 명시적으로 표시할 수 있다. rwnd(receive window)라고 부른다.
Sequence number란? ACK이란?

현재 A가 B에게 'C'라는 데이터를 전송하고 있는 상황이다.
간단하게 설명하자면 Seq란 내가 보낼 데이터의 시작점,ACK이란 내가 받아야할 데이터의 시작점을 말한다.
첫 번째 화살표에는 Seq=42 ACK=79 data='C' 라고 되어 있다.
현재 A가 42번째 데이터부터 보낼 것을 의미한다. 그리고 A는 B로부터 79번째 데이터부터 수신받기를 원한다.
B는 42번째 데이터를 정상적으로 수신받았으므로 그 다음 데이터인 43번째 데이터부터 보내줄 것을 요청하고 있다.('C'가 1byte이므로 43이다. 만약 데이터가 'AB'였다면 44일 것이다.)
그리고 A가 B에게 79번째 데이터부터 보내달라고 요청했으므로 B는 79번째 데이터부터 A에게 전송한다.
Retransmission scenarios

lost ACK
ACK이 전송되던 중에 loss된 상황이다.
A가 데이터를 정상적으로 보냄 -> B는 데이터를 수신 후 다음 데이터를 요청함 -> 요청(ACK=100)이 정상적으로 전달되지 않음 -> A는 ACK을 수신받지 못하므로 timeout발생하자마자 바로 데이터를 재전송함
premature timeout
timeout이 너무 짧게 설정된 상황이다.
tcp가 pipelining protocol이므로 한 번에 두 개의 패킷을 전송하고 있다.
A가 데이터를 정상적으로 보냄 -> B는 데이터를 수신 후 다음 데이터를 요청함 -> ACK이 전송되기도 전에 timeout이 발생했으므로 A는 데이터를 재전송함
불필요한 재전송이 발생했다.
timeout을 적절하게 설정해야한다는 점을 다음 상황을 통해서 알 수 있다.

cumulative ACK
A가 데이터를 정상적으로 보냄 -> B는 각 데이터에 대한 ACK을 보냄 -> 이 때,두 번째 데이터에 대한 ACK(120)만 정상적으로 전송됐으며 첫 번째 데이터에 대한 ACK(100)은 loss가 발생함
결론적으로 말하자면 "아무 문제 없다"
왜냐면 tcp의 특징 4번째 => cumulative ACK 이기 때문이다.
ACK = 100은 "나 99번째 바이트까지 잘받았어요~ 100번째부터 보내주세요~"
ACK = 120은 "나 119번째 바이트까지 잘받았어요~ 120번째부터 보내주세요~" 라는 뜻이다. 그러니까 ACK=100이 전송되지 않아도 ACK=120이 100의 역할까지 다 한다는 것이다. loss가 발생해도 누적 ACK을 통해 이 상황을 커버쳐준다!
Fast retransmit

fast retransmit이란?
3개의 중복된 ACK을 받았을 때 바로 재전송을 하는 것이다.
A는 한 번에 네 개의 패킷을 전송하고 있다.(pipelining)
그런데 두 번째 패킷이 전송되던 중에 loss가 발생했다.
그러므로 B는 100번째 바이트부터 받지 못했다는 것을 A에게 알리기위해 계속해서 ACK=100을 답신으로 보낸다. A 입장에서 3개의 중복 ACK이 왔으므로 timeout시간이 다 지나지 않아도 바로 재전송을 한다.
timeout이 발생할 때까지 기다리지 않아도 되므로 빠르게 재전송이 일어난다.