connection-oriented protocol로 virtual connection을 한다.(데이터 전달 전 미리 연결을 해야 한다.)
Flow control과 에러 검출 및 복구를 수행한다.
Sender와 Receiver가 virtual connection을 만들어, 데이터를 전달하여 통신한다.
따라서 TCP를 stream-oriented protocol이라고 한다.
TCP는 Sending buffer와 Receiving buffer를 사용한다. (buffer로 circular queue를 사용)
TCP에서 사용하는 헤더 정보가 추가된 데이터 포맷이다.
에러 검출 및 복구 목적으로 각 segment에 헤더 정보를 추가하여 IP layer에 전달한다.
segment의 순서가 뒤바뀌거나, segment가 분실되거나, 손상된 경우에는 재전송한다.
TCP의 송수신 단위는 byte이다 (byte 단위로 전송하고 읽는다)
TCP는 full-duplex service를 제공한다. (두 프로그램이 연결되면 서로 데이터를 전달하고 받을 수 있다)
segment가 전달하는 데이터의 첫 번째 바이트의 sequence number를 segment의 sequence number로 지정한다.
받은 데이터의 다음 데이터를 요구하는 숫자로 지정한다.(받을 데이터의 시작 byte number)
예) 7,056까지 잘 받았으면 7,057을 acknowledge number로 지정
TCP는 동시에 송수신이 가능하다.
따라서 아래와 같이 SYN -> ACK + SYN -> ACK를 통해 연결하게 된다. (Simultaneous Open)
참고 ) SYN flooding attack : 메시지 내에서 SYN을 1로 한 후 계속하여 요청을 보내면 서버가 죽을 수 있다
급하게 보내야할 데이터가 있을 경우에 application에서 push request를 한다. 이 경우에는 TCP가 바로 segment를 만들어서 전송한다. -> Pushing data
데이터 중에 긴급하게 읽혀야 할 데이터가 있는 경우에 URG bit를 1로 하여 전송하면, TCP는 받자마자 순서와 관계 없이 바로 application으로 데이터를 전달한다. -> Urgent data
위와 같은 경우에는 서로 데이터 전송이 끝났기 때문에 연결을 해제한다.
A -> B 데이터 전송은 끝났지만, B -> A 데이터 전송은 끝나지 않은 경우에 B -> A 데이터 전송이 끝날 때까지 연결이 유지될 수 있다.
ACK는 타이머에 따라서 전송한다. (전통적으로 500 =ms마다 전송)
RTO (Retransmission Timeout)
TCP의 속도를 개선하기 위해서 고안된 방법으로, 1) 수신단에서는 데이터를 받을 때마다 ACK를 보내고 2) 송신단에서는 동일한 데이터에 대해 ACK를 3회 중복으로 받으면 즉시 데이터를 재전송한다.
(단, ACK의 유실에 따른 재전송은 존재하지 않는다)
sender는 데이터 전송 시 한 번에 receive window를 모두 채울 수 있는 양의 데이터를 보내지 않는다.
순차적으로 증가시킴(congestion avoidance, additive increase) : 송신단에서 수신단까지 데이터를 전송하는 과정에서 네트워크에 트래픽이 몰릴 경우, 중간에 있는 네트워크 장치들이 수용할 수 있는 데이터의 양을 넘길 수 있다. 따라서 한 번에 보내지 않고 조금씩 조절해서 전송하는 양을 하나 씩 늘리는 방법.
2의 배수만큼 증가시킴(slow start, exponential increase) : 매 번 보낼 때마다 전송하는 양을 두 배로 늘리는 방법.
Cwnd : Congestion Window
전통적인 방법의 TCP
1개부터 시작하여 두 배씩 증가시키다가, 중간에 문제가 발생하면 다시 1개로 개수를 줄인다. ((문제 발생 시점에서 전송한 수) / 2)개까지는 두 배씩 증가시키고, 그 이후부터는 1개씩 증가시키는 방식으로 데이터를 전송한다.
Taho TCP보다 속도가 더 빠른 TCP으로, Fast retransmission 방식으로 데이터를 전송한다.
Taho TCP와 달리 1개씩 증가하는 구간에서 문제가 발생하더라도 개수를 1로 줄이는 것이 아니라, Fast retransmission을 통해 속도를 올려서 최대한 전송 속도가 떨어지지 않도록 한다. => 평균 전송 속도를 높일 수 있다.