본문 바로가기

네트워크

TCP

Transport layer에서 가장 많은 트래픽을 차지하는 TCP에 대해서 알아보자. 

TCP는 application에 대해 아래의 특징을 가진다.
1.end-to-end 통신
2.연결 지향 통신
3.1:1 통신
4. 신뢰가능한 통신
5. 전이중 통신
6. stream 패러다임

TCP안에서의 연결은 virtual connection이라고도 불리는데 이유는 connection이 소프트웨어적으로 이뤄지기 때문.
또한, 하나의 컴퓨터에서 동시에 여러 어플리케이션이 간섭없이 통신가능하다. 참고로 어플리케이션은 포트넘버로 구별 가능하다. TCP는 endpoints의 쌍으로 통신하기 때문에 아래의 4개의 정보가 필요하다. 
송신자의 IP, TCP 송신port, 수신자의 IP, TCP 수신port. 이를 four-tuple이라고 부른다.

TCP는 신뢰성 있는 통신이다. 이를 어떻게 지원하는지 알아보자.
먼저 인터넷에서 통신을하면 패킷이 중복되거나 순서가 뒤바뀔 수 있다고 했는데 TCP는 이것을 sequence number를 통해 해결한다. 아래 그림을 보자.

TCP 통신예시

위 예시에서 client에서 server에게 sequence number와 tcp segment의 길이를 보내주면 server에서 이를 받고 ack와 함께 seq + leng의 값을 반환한다. 이런 통신이 tcp 연결이 종료될 때까지 계속되며 최종 도착지에서 이미 가지고있는 seqence number가 있다면 버리고 sequence number로 순서를 보장할 수 있다. 이뿐 아니라 재전송(retransmission)이라해서 TCP 통신을하면서 ACK를 받을 때까지 시간을 어느정도 기억해놨다가 이 시간안에 들어오지 않으면 중간에 패킷을 잃어버린 것으로 간주하고 다시 재전송을 하는 기능도 가지고 있다.

그다음으로는 처리량을 늘리기 위한 TCP의 장치가 있다. sliding window기법이라 해서 패킷을 하나씩 전송하기 보다 여러개의 패킷을 동시에 보내는 방식이다. 여러 패킷은 window크기에 따라 달라지며 보통 수십개정도라고 한다. 이런 window크기는 일정한 것이 아니라 TCP가 network가 혼잡한지 여부(패킷을 잃어버렸나)를 보고 size를 조절한다. 


통신이 시작되면 송신측에서 congestion window(cwnd)를 1개의 segment(IP header, TCP header를 제외한 payload크기)로 잡고 데이터를 전송하기 시작한다. 만약 수신측으로부터 ACK가 도착한다면 congestion window size를 두배씩 증가시킨다. 계속 2배로 증가시키다가 sstrheshold에 도달하면 cwnd를 줄이고 1MSS(maximum segment size)만큼 증가시킨다.
만약 패킷을 잃어버리게되면 ssthreshold를 loss이전의 cwnd 크기의 절반으로 줄인다.
이것을 congestion avoidance라고 함.


이때 송신측이 수신측이 받을 수 있는 데이터양보다 빠른 속도로 많이 보내면 어떻게 될까?? 버퍼가 넘쳐서 패킷을 저장하지 못할 것이다. 이런 일을 방지하기 위해 수신측은 내가 버퍼로 어느정도를 받을 수 있는지를 나타내는 receive window를 보낸다. 만약 receiver가 데이터를 받을 수 있다고 한다면 양의 window값을 보내고 반대라면 0을 ACK에 함께 보낸다. 그래서 송신측에서는 congestion widnow와 receive window의 최솟값을 window크기로 잡고 보내게 된다.

 

 

 

 

참고
https://madpackets.com/2018/04/25/tcp-sequence-and-acknowledgement-numbers-explained/

 

TCP Sequence and Acknowledgement Numbers Explained

TCP Sequence (seq) and Acknowledgement (ack) numbers help enable ordered reliable data transfer for TCP streams.  The seq number is sent by the TCP client, indicating how much data has been sent fo…

madpackets.com

 

https://gyoogle.dev/blog/computer-science/network/%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4%20&%20%ED%98%BC%EC%9E%A1%EC%A0%9C%EC%96%B4.html

computer networks and internet 6th edition

'네트워크' 카테고리의 다른 글

UDP(User Datagram Protocol)  (1) 2022.12.06