Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

나나나

[네트워크] TCP 본문

CS

[네트워크] TCP

Leenk 2021. 4. 11. 21:23

가장 일반적인 전송 계층 프로토콜로 IP와 함께 작동하며 IP프로토콜에서 제공하는 네트워크 계층 서비스를 사용하여 프로세스 간에 안정적인 전송 서비스를 제공한다.

TCP가 애플리케이션 계층에 제공하는 서비스

  1. 연결 지향형 서비스
    1. 연결 설정 / 데이터 전송 / 연결 종료의 과정을 거친다. 이는 전송 데이터의 신뢰성과 무결성을 보장하기 위한 것이다.
  2. 스트림 데이터 서비스
    1. TCP에서는 데이터가 바이트 스트림으로 송수신된다. (UDP는 데이터그램, IP는 패킷 단위를 사용함) 네트워크 계층은 패킷을 사용하기 때문에 TCP는 바이트 스트림을 기본단위로 하여 세그먼트로 그룹화하고 각 세그먼트에 헤더를 추가한 다음 이를 네트워크 계층에 전달한다. 네트워크 계층에서 각 세그먼트는 전송을 위해 IP 패킷에 캡슐화된다. TCP헤더에는 제어 목적에 필요한 정보가 있으며 세그먼트 구조와 함께 논의된다.
  3. 전이중 서비스
    1. 통신이 동시에 양방향으로 이루어질 수 있다.
  4. 신뢰성
    1. TCP는 신뢰성을 위해 오류를 감지하는 체크섬을 사용한다. 그 외의 재전송, Acknowledgement 정책, 시퀀스 번호 및 타이머를 통해 손실/손상된 패킷을 복구한다. 신뢰성 보장을 위해 바이트 번호, 시퀀스 넘버 및 ack 번호를 사용한다. 또한, 혼잡 제어 매커니즘을 사용한다.
  5. 프로세스 간 통신
    1. TCP 는 프로세스간 통신 기능을 제공한다. 즉, 데이터 전송은 종단 시스템에서 실행되는 개별 프로세스 사이에서 발생한다. 이것은 포트 번호나 포트 주소를 사용하여 수행된다. 포트 번호는 16bit길이이며 호스트에서 데이터를 송수신하는 프로섹스의 식별을 돕는다.
  6. 멀티플렉싱
    1. +) 멀티플렉싱 :기본적으로 멀티플렉싱이란 여러 개를 하나로 묶어 다중화 시킨다는 뜻이다. 코드에서 볼 것은 여러 개의 channel을 하나로 묶어서 사용하는 것인데, 이 방법을 입출력에 적용한다. 여기서 입출력 버퍼를 사용하게 된다.출처:[JayTech의 기술 블로그]
    2. https://pjh3749.tistory.com/170
    3. Blocking mode로 동작하는 것들과는 달리 멀티플렉싱은 Non-Blocking Mode로 동작하게 된다.
    4. 하나의 통신 채널을 통해서 둘 이상의 데이터를 전송하는데 사용되는 기술이다.
    5. 물리적 연결을 통해 포트 번호 간 다수의 논리적 연결을 설정할 수 있으므로 송신자 및 수신자의 종단에서 각각 멀티플렉싱 및 디멀티플렉싱을 수행한다.

바이트 번호, 시퀀스 번호, Ack 번호

  • 전송될 모든 데이터 바이트는 번호가 매겨지며, 이 번호의 시작은 임의적이다.
  • 시퀀스 번호는 세그먼트에 제공되어 다른 순서로 도착하더라도 수신자 종단에서 바이트를 재어셈블한다. 세그먼트의 시퀀스 번호는 전송되는 첫 번째 바이트의 바이트 번호이다.
  • TCP는 전이중 서비스를 제공하므로 Ack 번호가 필요하다. Ack번호는 수신자가 수신할 것으로 예상하는 다음 바이트 번호이며 이전 바이트 수신에 대한 Ack도 제공한다.

  1. A : 바이트 번호 1000까지 받았고 그 다음으로 1001부터 받길 원하기 때문에 1001이라는 ACK를 보낸다.
  2. B : A에게 1001부터 시작하는 데이터 BYTES를 보낸다. B는 13001까지 받았기 때문에 13002라는 ACK를 보낸다.

혼잡제어

TCP 혼잡제어 > 도리의 디지털라이프

송신 측에서 Ack수신 여부로 네트워크 상황을 판단해 송신 데이터의 크기를 조절하는 기법

  1. 송신자 전송률 제한 : cwnd의 값을 조정해 데이터 전송 비율 조정
  2. 혼잡 감지 : TCP 송신자는 손실이벤트(Timeout, Duplicate ACK)발생 시 송신률을 낮춤

Slow Start

cwnd < ssthresh 일 때 cwnd는 지수적으로 증가한다.

새로운 TCP 연결 생성이나 Timeout으로 패킷 손실이 발생한 경우 수행한다.

  • Timeout : cwnd = 1
  • 3 Duplication ACK : ssthresh = 1/2, cwnd = ssthresh로 변경후 Congestion Avoidance 상태로 전이

Congestion Avoidance

지수적 증가가 ssthresh에 도달하면 혼잡으로 간주하고 혼잡을 회피하기 위해 선형적으로 증가한다.

Fast Retransmit과 Fast Recovery

  • Fast Retransmit : 세 번의 Duplicate ACK가 발생하면(마지막으로 잘 도착한 패킷의 다음 순번을 ACK패킷에 실어서 보내므로 패킷이 손실되면 중복된 ACK가 도착함) Timeout을 기다리지 않고 즉시 전송 시작
  • Fast Recovery : Fast Retransmit 수행 후 Congestion Avoidance 수행(not Slow start)

3-Way Handshake(연결 설정)

https://asfirstalways.tistory.com/356

이는 TCP 연결을 설정하는 방법으로도 볼 수 있다. 이는 신뢰성 있게 데이터 전송을 제어하기 위해 TCP가 수행해야 하는 동작들이다.

  1. SYN : 첫 단계에서 클라이언트는 서버와 연결을 설정하길 원한다. 그러므로 클라이언트가 통신을 시작하고 싶다는 것을 서버에게 알리는 SYN 세그먼트를 전송하고 세그먼트를 시작하는 시퀀스 번호를 지정한다.
  2. SYN + ACK : 서버는 SYN + ACK로 클라이언트 요청에 응답한다. ACK는 수신받은 세그먼트에 대한 응답을 나타내고 SYN은 세그먼트를 시작할 수 있는 시퀀스 넘버를 나타낸다.
  3. ACK : 마지막 부분에서 클라이언트는 서버의 응답을 확인하고 둘 다 실제 데이터 전송을 시작할 신뢰할 수 있는 연결을 설정한다.

+) 1번과 2번은 단방향에 대한 시퀀스 번호를 설정하고 승인된다. 2번과 3번을 통해 다른 방향에 대한 시퀀스 번호를 설정하고 승인된 뒤, 전이중 통신이 설정된다.

+) 이 때 시퀀스 넘버는 랜덤하다.

4-Way Handshake(연결 해제)

  1. FIN : 클라이언트는 연결을 종료하겠다는 FIN플래그를 전송한다.
  2. ACK : 서버는 클라이언트의 요청(FIN)을 받고 확인했다는 의미로 ACK를 보낸다.
  3. 전송 중인 데이터를 모두 보낼 때까지 잠깐 TIME_OUT을 거친다.
  4. FIN : 데이터를 모두 보내고 통신이 끝났으면 연결이 종료되었음을 알리는 FIN 플래그를 전송한다.
  5. ACK : 클라이언트는 FIN메시지를 확인했다는 의미로 ACK를 보낸다.

+)서버는 ACK 메시지를 받은 후 소켓 연결을 종료한다.

+)클라이언트는 아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 ACK를 보낸 후 일정 시간 동안 세션을 열어 놓는다(TIME_WAIT)

'CS' 카테고리의 다른 글

[네트워크]HTTP 메소드와 멱등성  (0) 2021.04.11
[네트워크]HTTP 헤더  (0) 2021.04.11
[네트워크] TCP와 UDP  (0) 2021.04.11
[네트워크] OSI 7계층  (0) 2021.04.11
[네트워크] 웹의 동작  (0) 2021.04.11